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