Flutter:在 RiverPod 中,如何直接改变状态模型的变量?

Flutter: In RiverPod , how to alter state model's variables directly?

我目前正在学习 River Pod,也是 flutter 的新手。

在 StateNotifer 中设置新状态时,我需要创建一个新模型并替换状态

但是直接改不行

class CounterModel  {
  CounterModel(this.count, this.age);
    int count;
    int age;
}

class CounterNotifier extends StateNotifier<CounterModel> {
  CounterNotifier() : super(_initialValue);
  static CounterModel  _initialValue = CounterModel(0,18);

  void increment() {
  //  state.count = state.count + 1; // not working, but need like this !
    state = CounterModel(state.count + 1, state.age); // working 
  }

}

在上面的代码中,当我尝试直接更改计数变量时,state.count = state.count + 1,没有任何改变

但是当通过创建新模型重新初始化状态时 state = CounterModel(state.count + 1, state.age)

状态模型变量似乎是不可变的,每次更改都需要重新创建!

我的问题是,如果 CounterModel 有 50 个变量怎么办,那么我必须做类似

的事情
state = CounterModel (var1,var2,......,var49,var50) ;

那么,是否可以像

那样直接改变变量
state.var1 = new_value1;
state.var2 = new_value2;
....
state.var50 = new_value50;

您必须始终为 Consumer 重新分配 StateNotifier 中的 state 才能看到更改,因此,state.var1 = new_value1; 无法与 StateNotifier 一起使用

如果您非常喜欢这种语法,请使用 ChangeNotifier,因为它允许您更改 class 的各个属性,但您必须调用 notifyListeners

像这样:

class CounterNotifier extends StateNotifier {
  static CounterModel value = CounterModel(0,18);

  void increment() {
    value.count = value.count + 1;
    notifyListeners();
  }
}

如果您想坚持使用 StateNotifier 并且不想编写样板代码,请在模型上创建一个 copyWith 方法。

像这样:

class CounterModel  {
  CounterModel(this.count, this.age);
  int count;
  int age;

  CounterModel copyWith({int? count, int? age}){
     return CounterModel(
       count ?? this.count,
       age ?? this.age
     );
  }
}

然后你可以像这样继续重新分配它:

class CounterNotifier extends StateNotifier<CounterModel> {
  CounterNotifier() : super(_initialValue);
  static CounterModel  _initialValue = CounterModel(0,18);

  void increment() {
    state = state.copyWith(count: state.count + 1); 
  }

}