我有一个模型,它是一个蓝图,在我通过HTTP发送它之前要填充。模型包含一个bool值:
class ReportBugModel {
bool isReproductive;
ReportBugModel({
this.isReproductive = false,
}) ;
ReportBugModel copyWith({
bool? isReproductive,
}) {
return ReportBugModel(
isReproductive: isReproductive ?? this.isReproductive,
);
}
}
字符串
然后我有一个StateNotifer,带有这个模型:
class FillReportBugModelNotifier extends StateNotifier<ReportBugModel> {
FillReportBugModelNotifier() : super(ReportBugModel());
void toggleReproductive() {
print("inside toggle");
state = state.copyWith(isReproductive: !state.isReproductive);
}
}
final fillErrorModelProvider = StateNotifierProvider<FillReportBugModelNotifier, ReportBugModel>((ref) {
return FillReportBugModelNotifier();
});
型
在我的小部件中,现在有一个问题:
class _AdditionalInfoScreenState extends ConsumerState<AdditionalInfoScreen> {
@override
Widget build(BuildContext context) {
final isChecked = ref.watch(fillErrorModelProvider).isReproductive;
print(isChecked);
return Stack(
children: [
//...
CheckboxListTile(
value: isChecked,
onChanged: (bool? value) {
ref.read(fillErrorModelProvider.notifier).toggleReproductive();
},
型
正如你所看到的,我添加了一个print语句,这是在HotRestart和两次点击复选框后的输出(预期输出应该是:false -> true然后true -> false”:
"Restarted application in 232ms.
false
false
false
inside toggle
true
false
inside toggle
true"
型
这是一个奇怪的行为,我无法解释,比如它切换得非常快,但我只点击了一次。我做错了什么?
1条答案
按热度按时间ncecgwcz1#
将
ReportBugModel
模型设置为不可变,然后重复上述步骤。StateNotifier
必须基于不可变的数据,也就是说,在其模型中有final
字段,并且状态更改基于一个全新的对象。为了更容易实现,请使用freezed
包,因为这将为您生成copyWith
方法和正确的hashCode
/operator ==
。