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