dart Flutter Riverpod -带有StateNotifierProvider和模型的复选框,它是如何工作的

2ic8powd  于 2024-01-03  发布在  Flutter
关注(0)|答案(1)|浏览(136)

我有一个模型,它是一个蓝图,在我通过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"


这是一个奇怪的行为,我无法解释,比如它切换得非常快,但我只点击了一次。我做错了什么?

ncecgwcz

ncecgwcz1#

ReportBugModel模型设置为不可变,然后重复上述步骤。StateNotifier必须基于不可变的数据,也就是说,在其模型中有final字段,并且状态更改基于一个全新的对象。为了更容易实现,请使用freezed包,因为这将为您生成copyWith方法和正确的hashCode/operator ==

相关问题