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



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

在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,因为它允许您更改类的各个属性,但必须调用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); 
}
}

相关内容

  • 没有找到相关文章

最新更新