Flutter 颤振群中的“currentState”属性突变

Flutter 颤振群中的“currentState”属性突变,flutter,bloc,rxdart,Flutter,Bloc,Rxdart,我有一个Flitter应用程序,在这个程序中,我在listView窗口小部件中显示了按姓名和销售额排序的员工列表。我有两个按钮供每个员工增加或减少销售额 我正在使用状态管理 这是Employee类 class Employee扩展了equalable{ 内部id; 字符串\u名称; 双塞勒里; 员工(此._id,此._姓名,此._salery); //二传手 集合id(整数id){ 这个。_id=id; } 集合名称(字符串名称){ 这个。_name=name; } 套装萨利里(双萨利里){ 这

我有一个Flitter应用程序,在这个程序中,我在listView窗口小部件中显示了按姓名和销售额排序的员工列表。我有两个按钮供每个员工增加或减少销售额

我正在使用状态管理

这是Employee类

class Employee扩展了equalable{
内部id;
字符串\u名称;
双塞勒里;
员工(此._id,此._姓名,此._salery);
//二传手
集合id(整数id){
这个。_id=id;
}
集合名称(字符串名称){
这个。_name=name;
}
套装萨利里(双萨利里){
这个。_salery=salery;
}
//吸气剂
int get id=>this.\u id;
字符串get name=>this.\u name;
double get salery=>这个;
}
这是课堂活动

@不可变
抽象类EmployeeEvent{
最终综合指数;
员工事件(此._索引);
int get index=>this.\u index;
}
类IncrementEvent扩展了EmployeeEvent{
IncrementEvent(int-index):super(index);
}
类DecrementEvent扩展EmployeeEvent{
递减事件(int索引):超级(索引);
}
下面是处理状态的bloc类

class EmployeeBloc扩展了Bloc{
@凌驾
列表获取初始状态=>[
员工(1名,“员工一号”,10000.0),
员工(2名,员工2名,10000.0),
员工(3名,员工三名,10000.0),
员工(4名,员工4名,10000.0),
员工(5名,“员工5名”,10000.0),
];
@凌驾
流mapEventToState(EmployeeEvent事件)异步*{
//我查过了,控制权在这里。
double currentSalery=currentState[event.index].salery;
if(事件为递增事件){
//当用户按下递增按钮时,递增销售额
currentState[event.index].salery=currentSalery+(currentSalery*0.2);
}else if(事件为DecrementEvent){
currentState[event.index].salery=currentSalery-(currentSalery*0.2);
}
打印(currentState[event.index].salery);//甚至打印递增/递减的salery。
屈服电流状态;
}
}
屈服后,小部件类中的
BlocBuilder
不会被调用

如果我像这样更改方法,那么它将调用
BlocBuilder
,但我不能在特定索引处增加或减少员工的销售额

@覆盖
流mapEventToState(EmployeeEvent事件)异步*{
if(事件为递增事件){
屈服电流状态;
}else if(事件为DecrementEvent){
屈服电流状态;
}
}

如何在特定索引中增加或减少特定员工的销售额?

您的主要问题是没有任何类来表示您的状态。所以首先你应该创建需要的状态。您可以使用
bloc
中提供的简单示例

为了全球理解:

BlocBuilder
将仅在这些情况下重建(使用
equalable
):

  • 新状态和旧状态的实例运行时类型不同
  • 新状态和旧状态的实例是相同的实例类型。它将通过调用
    ==
    深入比较先前状态和新状态的所有嵌套属性,以了解发生了哪些更改
  • 您还可以使用创建时提供的
    条件
    属性函数
如果要使用相同的实例,可以扩展
equalable
(从
equalable
包中)或执行与之相同的操作。(中级职位可以帮助你)

对于您的案例,您可以这样做:

抽象类EmployeeState扩展了Equalable{
EmployeeState([List props=const[]):超级(props);
@凌驾
字符串toString()=>“$runtimeType{}”;
}
EmployeeLoaded类扩展EmployeeState{
EmployeeLoaded(this.employees):超级([employees])
最终员工名单;
}
有关更多信息/帮助,请访问

要求您生成状态的新实例,而不是修改当前状态

因此,我在下面的课程中做了以下更改

class Employee扩展了equalable{
int-id;
字符串名;
双塞勒里;
雇员(this.id,this.name,this.salery):超级([id,name,salery]);
员工抄袭({
字符串名,
双塞勒里,
}) {
返回员工(this.id、name??this.name、salery??this.salery);
}
@凌驾
字符串toString(){
返回'Employee{id:$id,name:$name,salery:$salery}';
}
}
修改了mapEventToState方法并添加了一个帮助器方法来更新列表属性

@覆盖
流mapEventToState(EmployeeEvent事件)异步*{
生成此.updateList(事件);
}
流更新列表(EmployeeEvent事件)异步*{
最终id=(当前状态为EmployeeLoaded).employee[event.index].id;
员工名单更新=
(当前状态为EmployeeLoaded).employee.map((employee){
if(employee.id==id){
返回employee.copyWith(
salery:(事件是递增事件)
?employee.salery+200
:employee.salery-200);
}
返回员工;
}).toList();
打印((当前状态为EmployeeLoaded)。employee==employeeUpdate);
打印(currentState==EmployeeLoaded(employeeUpdate));
产出EmployeeLoaded(employeeUpdate);
}