Провайдер Flutter, использующий дочерний виджет для обновления списка - PullRequest
0 голосов
/ 14 июля 2020

Я новичок в использовании Flutter, и в настоящее время я изо всех сил пытаюсь понять, как использовать пакет Provider для следующей задачи, и является ли это вообще правильной реализацией.

У меня есть виджет, который использует другой виджет внутри себя для обновления значения времени.

В родительском виджете у меня есть следующее:

class _AddTimesScreenState extends State<AddTimesScreen> {
 List<TimeOfDay> times = [];
 @override
  Widget build(BuildContext context) {
    return Scaffold(      
      body: Provider<List<TimeOfDay>>.value(
        value: times,
    child: SetTimes()

Во втором виджете, который используется для обновления списка времени с помощью средства выбора времени у меня есть:

class _SetTimesState extends State<SetTimes> {
  @override
  Widget build(BuildContext context) {
    final times = Provider.of<List<TimeOfDay>>(context);

По сути, моя цель - иметь возможность обновлять список времен во втором виджете, чтобы затем его можно было использовать в первом виджете. У меня есть методы для добавления объектов TimeOfDay в список, но при запуске кода список в первом виджете не обновляется.

Использую ли я Provider так, как он предполагал, или я совершенно недопонял его приложение?

Спасибо

1 Ответ

1 голос
/ 15 июля 2020

В классе TimeOfDay убедитесь, что вы расширяете его с помощью средства уведомления об изменениях.

Как провайдер узнает, что его нужно перестроить?

Когда класс (TimeOfDay in ваш случай) расширяет ChangeNotifier, вам предоставляется метод под названием notifylisteners () , это запускает перестройку всех виджетов, использующих поставщика. Поэтому вам следует вызвать это в функции, которая изменяет данные объектов в вашем классе TimeOfDay.

Поэтому убедитесь, что вы:

  • расширяете ChangeNotifier в своем классе / модели.
  • вызов уведомлений при изменении данных.

Пример:

class MyClass extends ChangeNotifier{

int a = 0;

  addSomething(){
    //Here we are changing data
    a = a + 1;
    notifylisteners();
  }

}

дайте мне знать, если это решит вашу ошибку.

...