Flutter: setState () или markNeedsBuild () вызывается во время сборки с провайдером - PullRequest
0 голосов
/ 18 марта 2020

Я вызываю одну из ChangeNotifier функций из метода initState(), а вызов notifyListener() внутри функции вызывает setState() or markNeedsBuild() called during build. исключение

void initState(){
 Provider.of<MessengerRepository>(context, listen: false).setUnreadCount(0);
 super.initState();
}
class MessengerRepository with ChangeNotifier {
  int unreadCount;
  void setUnreadCount(int value){
     unreadCount = value;
     notifyListeners();
}

Мне нужно вызов notifyListener() внутри setUnreadCount(), так как я вызываю функцию setUnreadCount() в нескольких местах во время выполнения. Поэтому нельзя удалить notifyListener() только внутри initState().

Используя provider версию 4.0.4

1 Ответ

0 голосов
/ 18 марта 2020

Вы можете переместить Provider.of<MessengerRepository>(context, listen: false).setUnreadCount(0); с intState на didChangeDependecies, тогда он будет вызываться только после завершения процесса сборки страницы.

Или так: (менее элегантно)

void setUnreadCount(int value, {bool shouldUpdate: true}){
     unreadCount = value;
   if(shouldUpdate)  notifyListeners();

Затем

void initState(){
 Provider.of<MessengerRepository>(context, listen: false).setUnreadCount(0, shouldUpdate:false);
 super.initState();
}

Когда вы вызываете его в initState, если метод сборки завершается до того, как все ваши переменные (пере) назначены, они не будут обновлены, пока вы не вызовете setState или notifyListeners

Подробнее здесь

...