Флаттер notifyListeners, похоже, не работает

#flutter #flutter-provider #sqflite

Вопрос:

У меня есть текстовое поле, в котором я отображаю значение.
Затем у меня есть FAB, который позволяет мне добавлять значение в базу данных SQFlite через AlertDialog.
Когда я нажимаю кнопку добавить значение в текстовом поле, оно не обновляется, мне нужно снова открыть приложение, чтобы увидеть изменения.
Почему?
я делаю что-то не так?
Мой код:
В классе DBHelper методы добавления значения и считывания всех значений (это работает)

 Future create(Bmi bmi) async {  final db = await instance.database;   final id = await db.insert(tableBmi, bmi.toJson());  log(bmi.toString());  return bmi.copy(id: id);  }  Futurelt;Listlt;Bmigt;gt; readAllBmi() async {  final db = await instance.database;   final orderBy = '${BmiFields.dateTime} DESC';  final result = await db.query(tableBmi, orderBy: orderBy);  return result.map((json) =gt; Bmi.fromJson(json)).toList();  }  

Метод в bmilistviewмодели для добавления и чтения

 Listlt;BmiViewModelgt; bmiVm = [];   void readAllBmi() async {  Listlt;Bmigt; bmiList = await DbHelper.instance.readAllBmi();  loadingStatus = BmiLoadingStatus.loading;  notifyListeners();  this.bmiVm = bmiList.map((bmi) =gt; BmiViewModel(bmi: bmi)).toList();  if (this.bmiVm.isEmpty) {  this.loadingStatus = BmiLoadingStatus.completed;  } else {  this.loadingStatus = BmiLoadingStatus.completed;  }  notifyListeners();  }   addNewBmi(Bmi bmi) async {  log(bmi.value);  await DbHelper.instance.create(bmi);  notifyListeners();  }  

Главная.дротик

 return MultiProvider(  providers: [  ChangeNotifierProvider(create: (_) =gt; BmiListViewModel()),  ],  child: MaterialApp(  title: 'BodyM',  theme: ThemeData(  canvasColor: Color(0xFF1C1C1E),  primarySwatch: Colors.blue,  textTheme:  GoogleFonts.interTextTheme(Theme.of(context).textTheme)),  initialRoute: '/',  routes: routes,  ),  );  

TextButton to add

 TextButton(  child: Text("Add", style: TextStyle(color: Colors.green)),  onPressed: () async {  //here i create my bmi object  await Provider.oflt;BmiListViewModelgt;(context, listen: false).addNewBmi(bmi);  } else {  //TODO  }  },  ),  

Контейнер, содержащий текстовый виджет для отображения значения

 child: Container(  child: Padding(  padding: EdgeInsets.all(20.0),  child: Row(  children: [  if(bmiVm.toString() == '[]')  Text('N/A', style: TextStyle(color:Colors.white, fontSize: 80))  else  Text(bmiVm[0].valueBmi, style: TextStyle(color:Colors.white, fontSize: 80))  ],  ),  ),  )  

bmiVm это списокlt;’BmiViewModel’gt;, созданный перед методом сборки.

РЕШЕНИЕ: Я решил, просто после метода addNewBmi я должен вызвать метод readAllBmi, чтобы обновить список, а затем notifyListeners() сделает все остальное.

Ответ №1:

 TextButton(  child: Text("Add", style: TextStyle(color: Colors.green)),  onPressed: () async {  //here i create my bmi object  await Provider.oflt;BmiListViewModelgt;(context, listen: **true**).addNewBmi(bmi);  } else {  //TODO  }  },  ),  

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

Комментарии:

1. Вы можете попробовать это, чтобы перестроить все дерево виджетов и посмотреть, даст ли это вам ожидаемый результат. Он восстановит все, начиная с MaterialApp и ниже. Однако это кажется излишним. Уведомители должны сделать свое дело. Попробуйте установить на них точки отладки и выяснить, почему они работают неправильно.