请查看以下两个样本。
- 第一个示例没有重新构建Widgets[可能是'listener ']未被"通知"]
- 第二个示例如下将
以我的理解,我认为这两个都应该起作用。有人能告诉我我缺乏的理解吗?提前谢谢。
样本一(Doesnot)[ui更改不生效]
onTap: (String? newValue) {
ref.watch(UserProvider).selectedMaritalStatusValue = newValue!;
UserModel().notifyAllListeners(); //triggers notifyListeners
},
示例二(Does rebuild)[working fine]
onTap: (String? newValue) {
ref.watch(UserProvider).setMaritalStatus(newValue!); // 'setMaritalStatus' has notifyListeners trigger within
},
首先,你不应该在任何onTap回调中使用ref.watch。在这里使用ref.read代替。请阅读本文,以了解为什么会出现这种情况。
其次,在你的第一个代码块中,你写:UserModel().notifyAllListeners();
UserModel()创建一个新对象,并为这个新对象调用notifyAllListeners()。该小部件的构建方法中没有监视这个新对象。这就是为什么你发布的第一个代码块无法重建小部件的原因。
第三,作为最佳实践,任何类中的notifyListeners()等方法和字段的直接赋值都应该在类的代码中完成。在将来使用第二个代码块作为参考。这是正确和最安全的方法。
您可以使用私有变量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!;