Перестройка Flutter HookWidget при изменении значений

Здесь я использовал очень простой HookWidget а также Riverpod, когда я вызываю некоторые методы StateNotifierProvider например, я ожидаю, что мои виджеты, которые я использовал useProvider перестройте снова, например:

      class MyHomePage extends HookWidget {
  @override
  Widget build(BuildContext context) {
    final _orderProvider = useProvider(orderStateNotifierProvider.notifier);
    final List<SelectedProductServices> _serviceList = _orderProvider.getServices();
    return Scaffold(
        appBar: AppBar(
          title: Text('test'),
        ),
        body: Center(
          child:
          Consumer(
            builder: (_, watch, __) {
              return Column(
                children: <Widget>[
                  //...
                    GestureDetector(
                      onTap: () => _orderProvider.increment(productId: 1, serviceId: 1),
                      child: Container(
                          width: 200.0,
                          height: 50.0,
                          child: Text('ADD')),
                    )
                 //...
                ],
              );
            },
          ),
        ));
  }
}

здесь после нажатия на кнопку increment работать нормально, но _orderProvider не запускает экран, я пытался использовать как использование, так и неиспользование Consumer. за все время экран не может быть восстановлен

1 ответ

В методах попробуйте создать новые экземпляры вроде здесь:

        void increment({int productId,int serviceId}) {
    state = [// Generate a new list with current items in state
      for (final selectedService in state)
        if (selectedService.id == productId&&selectedService.sId==serviceId) 
          SelectedProductServices(
           //Create a new object with the updated internal state
          )
        else
          selectedService,
    ];
  }

Dart сравнивает свои объекты по ссылке, а не по значению, и когда вы изменяете внутреннее состояние списка, ссылка, которую он занимает в памяти, остается неизменной независимо от количества элементов, которые у него есть. Если список хранится внутри класса, вы можете переопределить == метод сравнения List<SelectedProductServices> с использованием DeepCollectionEquality но когда вы работаете напрямую с объектом List, вы можете создать только новый список с другой ссылкой в ​​памяти, чтобы oldState! = newState

Примечание: вы должны сделать все методы, которые изменяют внутреннее состояние и которые вы хотите обновить пользовательский интерфейс и уведомить его слушателей, чтобы они работали, как указано выше.

Другие вопросы по тегам