Если вызывается следующий setIntVal и notifyListeners(); выполняется, текст перерисовывается? intVal изменяется, а strVal нет.
Аналогично, что происходит при использовании StateNotifier?
class DummyManager with ChangeNotifier {
DummyManager();
int intVal = 0;
String strVal = "";
void setIntVal(val) {
intVal = val;
notifyListeners();
}
}
Consumer<DummyManager>(
builder: (context, model, child) {
return Text(model.strVal);
},
)
да конечно перерисовать, и уведомить всех слушателей и конечным потребителем иметь слушателя для этого
Вы изменяете свой объект state
в своем классе StateNotifier
, и интерфейс перерисовывается. Просто нужно учитывать, что новый state
должен быть новым объектом и неизменным.
Значит, если мы обновим объект состояния в классе StateNotifier, он будет перерисован? Я понимаю.
Да. И в этот класс можно поместить дополнительную логику и много-много методов. Все, что отвечает за состояние, будет в этом классе.
Да. По умолчанию любое изменение в уведомлении перестраивает потребителя.
Но вы можете оптимизировать это, используя select
:
Изменив потребителя на:
Consumer(
builder: (context, ref, child) {
final strVal = ref.watch(modelProvider.select((v) => v.strVal));
return Text(strVal);
},
)
Тогда ваш виджет будет перестраиваться только при изменении этого конкретного значения.
Обратите внимание, что результат должен быть неизменным. Таким образом, избегайте перенастройки списков
Ух ты. Мы не ожидали получить от вас ответ. Это отличный механизм. Спасибо.
Ах. Я понимаю. Нам придется разбить ChangeNotifier и StateNotifier на более мелкие части, чтобы свести к минимуму перерисовку.