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