请判断下面的两个样品.

  • 第一个示例不会重新构建小部件[可能是‘Listeners’ 没有收到‘通知’]
  • 第二个示例的工作方式为 预期

据我所知,我认为这两个都应该行得通.有人能向我简要介绍一下我缺乏的理解力吗? 先谢谢你.



示例一(是否重新生成not)[UI更改不会生效]

onTap: (String? newValue) {
ref.watch(UserProvider).selectedMaritalStatusValue = newValue!;
UserModel().notifyAllListeners(); //triggers notifyListeners
 },

样本二(是否重建)[工作正常]

onTap: (String? newValue) {
ref.watch(UserProvider).setMaritalStatus(newValue!); // 'setMaritalStatus' has notifyListeners trigger within
 },

推荐答案

首先,您不应该在任何ONTAP回调中使用ref.watch.请在此处使用ref.read.请阅读this,以明确为什么会出现这种情况.

其次,在您编写的第一个代码块中:

UserModel().notifyAllListeners();

UserModel()完全创建了一个新对象,并且为这个新对象调用了notfyAllListeners().在此小部件的Build方法中不会监视这个新对象.这就是您发布的第一个代码块无法重新构建小部件的原因.

第三,作为最佳实践,通知类Listeners()之类的方法和任何类中的字段的直接赋值都应该在类的代码中完成.使用您的第二个代码块作为将来的参考.这是正确且最安全的方式.

Flutter相关问答推荐

修复容器`Text`和容器表单之间的重叠

在Flutter 中将参数从一个类传递到另一个类

如何创建这样的按钮

应为Map String,dynamic类型的值,但得到的值为type()= Map String,dynamic'

按一下按钮即可更新 fl_chart

打开键盘时屏幕组件会被压扁

Flutter中不使用Container是否可以做margin

如何从列表中更新provider变量:Flutter列表和Provider优化指南

Firestore 使用 Flutter 以奇怪的格式保存数据

如何正确地将 PageView 设置为 AppBar 的标题?

我怎样才能消除我的 Column 子元素之间的差距?

当我使用 Confetti Widget 时,Flutter Android 和 IOS 应用程序崩溃

Flutter - 根据从第一个 DropdownButtonForm 中 Select 的内容在第二个 DropdownButton 上显示选项

按下 Command+W 时关闭窗口

Flutter 错误:正文可能正常完成,导致返回null

在 Flutter 中单击时切换按钮 colored颜色 没有改变

如何使用 Riverpod 在运行时动态创建提供程序?

带图像封面的 ElevatedButton

在 Flutter Bloc 中具有称为 status 的属性的一种状态或不同的状态,哪个更可取?

如何从dart 中的当前日期时间中减go 1 天?