颤振 notifyListeners 似乎不起作用
Posted
技术标签:
【中文标题】颤振 notifyListeners 似乎不起作用【英文标题】:Flutter notifyListeners seems not working 【发布时间】:2021-12-29 18:51:48 【问题描述】:我有一个 TextField,我在其中显示一个值。 然后我有一个 FAB,它允许我通过 AlertDialog 向 SQFlite 数据库添加一个值。 当我单击 TextField 上的添加值按钮时,它没有得到更新,我必须重新打开应用程序才能看到更改。 为什么? 我做错了吗? 我的代码: 在 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);
Future<List<Bmi>> readAllBmi() async
final db = await instance.database;
final orderBy = '$BmiFields.dateTime DESC';
final result = await db.query(tableBmi, orderBy: orderBy);
return result.map((json) => Bmi.fromJson(json)).toList();
BmiListViewModel 中要添加和读取的方法
List<BmiViewModel> bmiVm = [];
void readAllBmi() async
List<Bmi> bmiList = await DbHelper.instance.readAllBmi();
loadingStatus = BmiLoadingStatus.loading;
notifyListeners();
this.bmiVm = bmiList.map((bmi) => 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();
Main.dart
return MultiProvider(
providers: [
ChangeNotifierProvider(create: (_) => BmiListViewModel()),
],
child: MaterialApp(
title: 'BodyM',
theme: ThemeData(
canvasColor: Color(0xFF1C1C1E),
primarySwatch: Colors.blue,
textTheme:
GoogleFonts.interTextTheme(Theme.of(context).textTheme)),
initialRoute: '/',
routes: routes,
),
);
要添加的文本按钮
TextButton(
child: Text("Add", style: TextStyle(color: Colors.green)),
onPressed: () async
//here i create my bmi object
await Provider.of<BmiListViewModel>(context, listen: false).addNewBmi(bmi);
else
//TODO
,
),
包含用于显示值的 Text 小部件的容器
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 它是一个 List 在 build 方法之前创建。
解决方案:我解决了,只需在 addNewBmi 方法之后我必须调用 readAllBmi 方法来更新列表,然后 notifyListeners() 完成其余的工作。
【问题讨论】:
【参考方案1】:TextButton(
child: Text("Add", style: TextStyle(color: Colors.green)),
onPressed: () async
//here i create my bmi object
await Provider.of<BmiListViewModel>(context, listen: **true**).addNewBmi(bmi);
else
//TODO
,
),
您必须监听状态变化才能更新 UI。
【讨论】:
你可以试试这个,重建整个小部件树,看看它是否给你预期的结果。它将重建从 MaterialApp 及以下开始的所有内容。然而,这似乎是一个矫枉过正。 NotifyListeners 应该可以解决问题。尝试在它们上设置调试点并找出它们不能正常工作的原因。以上是关于颤振 notifyListeners 似乎不起作用的主要内容,如果未能解决你的问题,请参考以下文章