为什么颤振河舱直接赋值不起作用而方法起作用?



请查看以下两个样本。

  • 第一个示例没有重新构建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!;

最新更新