Управление состоянием флаттера, изменение состояния триггера из внешнего дерева виджетов

#flutter #state #provider

#флаттер #состояние #поставщик

Вопрос:

У меня есть следующие компоненты:

  1. DataModel (класс, который содержит некоторые переменные), в моем случае одноэлементный
  2. Несколько экранов, отражающих эту модель данных
  3. Несколько триггеров, которые обновляют модель данных, два из них не являются пользовательским интерфейсом: ответ от HTTP-вызова и данные, поступающие из WebSocket

Я пытаюсь добиться следующего потока в Flutter: прослушивание данных из HTTP-ответа / WebSocket -> обновление DataModel (изменение состояния) -> обновление пользовательского интерфейса

Я читал о разных подходах к управлению состоянием (https://flutter.dev/docs/development/data-and-backend/state-mgmt/options ), и попробовал некоторые из них (например, Provider). Моя главная проблема заключается в том, что я не могу понять, как обновить мою модель данных из компонентов, отличных от пользовательского интерфейса (например, HTTP response / WebSocket), поскольку мне нужно включить контекст (который в этом случае действительно не имеет значения), чтобы обновить мою модель данных, что-то вроде этого:

 Provider.of<DataModel>(context).onUpdate(myDataModel)
 

Каков самый простой подход для решения этой задачи (обновить DataModel -> запустить обновление пользовательского интерфейса)?

Ответ №1:

Комментарии:

1. Просмотрел документ и примеры. Ищу простой пример, где наблюдаемый объект является классом (со свойствами и методами) и не расширяет список (или что-то подобное). Также — не могу понять, как объявить поставщика, который будет доступен для любого класса / виджета в моем проекте: final testData = Provider((_) => TestData());

2.Я попрошу вас проверить пример, который отвечает на оба ваших вопроса: github.com/rrousselGit/river_pod/tree/master/examples/todos Rivepod.dev имеет очень хорошую документацию. (Ответ: 1) На этой странице вы можете увидеть, как создать класс, который расширяет StateNotifies => github.com/rrousselGit/river_pod/blob/master/examples/todos/lib /… (Ответ:2) Наиболее распространенный способ объявить поставщика — объявить их как глобальную константу следующим образом: final MyProvider = Provider((ref) { return myValue();}); Не бойтесь глобального аспекта поставщиков. Поставщики полностью неизменяемы.

3. Я также рекомендую вам посмотреть следующие видео, вы будете очень хорошо знать Riverpod после просмотра первых двух, но посмотрите все, вы многому научитесь (а) youtube.com/watch?v=GVspNESSess (b) youtube.com/watch?v=FHJM5pd1yF4 (с) youtube.com/watch?v=ttUNVsIl1tM (d) youtube.com/watch?v=atwWbkBdepE (e) youtube.com/watch?v=ls8Jm-viQkc

4. Спасибо за видео: они добавляют много информации. Что касается вопроса 2 (не связанного с управлением состоянием): если я объявлю final int temp = 1; в main.dart, как мне получить к нему доступ из другого класса / виджета?

5. Если final int temp = 1; имеет глобальную область видимости, просто импортируйте main.dart в библиотеку (файл), из которой вы хотите получить к ней доступ