[英]Why does Flutter riverpod direct assignment does not work but methods do
请检查下面的两个示例。
据我了解,我认为所有这两个都应该有效。 有人可以向我介绍一下我缺乏的理解吗? 提前致谢。
示例一(不重建)[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
},
您可以使用私有变量setter
,然后在更新变量后在 setter 中调用notifyListeners
,如下所示:
class UserProvider extends ChangeNotifierProvider{
String? _selectedMaritalStatusValue;
String? get selectedMaritalStatusValue => _selectedMaritalStatusValue;
set selectedMaritalStatusValue(String? newValue){
_selectedMaritalStatusValue = newValue;
notifyListeners();
}
}
现在,这应该有效:
ref.watch(UserProvider).selectedMaritalStatusValue = newValue!;
首先,您不应该在任何 onTap 回调中使用 ref.watch。 在这里使用 ref.read 代替。 阅读本文以清楚地了解为什么会这样。
其次,在您编写的第一个代码块中:
UserModel().notifyAllListeners();
UserModel() 共创建了一个新的 object,并且正在为这个新的 object 调用 notifyAllListeners()。这个新的 object 没有在这个小部件的构建方法中被监视。 这就是为什么您发布的第一个代码块无法重建小部件的原因。
第三,作为最佳实践,notifyListeners() 之类的方法和任何 class 中字段的直接赋值应该在类的代码中完成。 将来使用您的第二个代码块作为参考。 这是最正确、最安全的方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.