【问题标题】:Flutter: In RiverPod , how to alter state model's variables directly?Flutter:在 RiverPod 中,如何直接改变状态模型的变量?
【发布时间】:2022-01-18 07:38:58
【问题描述】:

我目前正在学习 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;

【问题讨论】:

    标签: flutter dart flutter-provider riverpod flutter-state


    【解决方案1】:

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

    如果您非常喜欢这种语法,请使用ChangeNotifier,因为它允许您更改类的各个属性,但您必须调用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); 
      }
    
    }
    

    【讨论】:

    • 很好的答案。即使对于 copyWith 方法,我们也需要一些额外的编码,但只是在开始。好吧。
    • 状态通知器VS变更通知器有什么区别和优势?
    • 它们之间的主要区别在于StateNotifier 将促进不可变架构。从长远来看,这倾向于使代码更易于维护。
    • 请教一个问题。所以没有直接的方法(通过修改变量,如 GetX)来刷新 Change 和 State 通知器中的状态,而不调用通知侦听器或重新初始化状态模型?对吧?
    • “刷新”是指将其设置为初始值吗?
    猜你喜欢
    • 2022-09-27
    • 2021-02-10
    • 1970-01-01
    • 1970-01-01
    • 2017-11-19
    • 2021-09-11
    • 2017-06-24
    • 1970-01-01
    • 2021-03-24
    相关资源
    最近更新 更多