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