首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在flutter_bloc中变异“`currentState`”属性

在flutter_bloc中变异“`currentState`”属性
EN

Stack Overflow用户
提问于 2019-07-12 10:40:18
回答 2查看 5.5K关注 0票数 2

我有一个灵活的应用程序,我在listView小部件中显示了员工名单,并列出了他们的名字和技巧。我有两个按钮,每个雇员增加或减少他们的工资。

我正在使用区块进行州管理。

这是雇员班。

代码语言:javascript
复制
class Employee extends Equatable {
  int _id;
  String _name;
  double _salery;

  Employee(this._id, this._name, this._salery);

  // setters
  set id(int id) {
    this._id = id;
  }

  set name(String name) {
    this._name = name;
  }

  set salery(double salery) {
    this._salery = salery;
  }

  // getters
  int get id => this._id;
  String get name => this._name;
  double get salery => this._salery;
}

这是作为活动的班级。

代码语言:javascript
复制
@immutable
abstract class EmployeeEvent {
  final int _index;
  EmployeeEvent(this._index);

  int get index => this._index;
}

class IncrementEvent extends EmployeeEvent {
  IncrementEvent(int index) : super(index);
}

class DecrementEvent extends EmployeeEvent {
  DecrementEvent(int index) : super(index);
}

下面是处理国家事务的集团类。

代码语言:javascript
复制
class EmployeeBloc extends Bloc<EmployeeEvent, List<Employee>> {
  @override
  List<Employee> get initialState => [
        Employee(1, 'Employee One', 10000.0),
        Employee(2, 'Employee Two', 10000.0),
        Employee(3, 'Employee Three', 10000.0),
        Employee(4, 'Employee Four', 10000.0),
        Employee(5, 'Employee Five', 10000.0),
      ];

  @override
  Stream<List<Employee>> mapEventToState(EmployeeEvent event) async* {
    // I have checked, the control reaches over here.
    double currentSalery = currentState[event.index].salery;
    if (event is IncrementEvent) {
      // Increments the salery when user presses the increment button
      currentState[event.index].salery = currentSalery + (currentSalery * 0.2);
    } else if (event is DecrementEvent) {
      currentState[event.index].salery = currentSalery - (currentSalery * 0.2);
    }
    print(currentState[event.index].salery); // even prints the incremented / decremented salery.
    yield currentState;
  }
}

屈服后,不调用小部件类中的BlocBuilder

如果像这样改变这个方法,它就会调用BlocBuilder,但是我不能在特定的索引上增加或减少员工的收入。

代码语言:javascript
复制
@override
Stream<List<Employee>> mapEventToState(EmployeeEvent event) async* {
  if (event is IncrementEvent) {
    yield currentState;
  } else if (event is DecrementEvent) {
    yield currentState;
  }
}

如何在特定指标上增加或减少特定员工的工资?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-07-13 10:12:31

颤振体要求您生成一个新的状态实例,而不是修改currentState。

因此,我在下面的类中做了以下更改。

代码语言:javascript
复制
class Employee extends Equatable {
  int id;
  String name;
  double salery;

  Employee(this.id, this.name, this.salery) : super([id, name, salery]);

  Employee copyWith({
    String name,
    double salery,
  }) {
    return Employee(this.id, name ?? this.name, salery ?? this.salery);
  }

  @override
  String toString() {
    return 'Employee { id: $id, name: $name, salery: $salery }';
  }
}

修改了mapEventToState方法,并添加了一个助手方法来更新列表属性。

代码语言:javascript
复制
@override
  Stream<List<Employee>> mapEventToState(EmployeeEvent event) async* {
    yield this.updateList(event);
  }

  Stream<EmployeeState> updateList(EmployeeEvent event) async* {
    final id = (currentState as EmployeeLoaded).employee[event.index].id;

    List<Employee> employeeUpdate =
        (currentState as EmployeeLoaded).employee.map((employee) {
      if (employee.id == id) {
        return employee.copyWith(
            salery: (event is IncrementEvent)
                ? employee.salery + 200
                : employee.salery - 200);
      }
      return employee;
    }).toList();

    print((currentState as EmployeeLoaded).employee == employeeUpdate);
    print(currentState == EmployeeLoaded(employeeUpdate));

    yield EmployeeLoaded(employeeUpdate);
  }
票数 1
EN

Stack Overflow用户

发布于 2019-07-12 11:08:44

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

为了达成全球谅解:

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

  • 新状态和旧状态的实例运行时类型不同。
  • 新状态和旧状态的实例是相同的实例类型,它将深入比较前一状态和新状态的所有嵌套属性,以了解通过调用==更改了什么。
  • 您还可以使用您在创建时提供的conditional属性函数。

如果您想使用相同的实例,可以扩展Equatable (从equatable package 这里)或做它正在做的事情。(中的帖子可以帮助你)。

用你的案子你可以做到:

代码语言:javascript
复制
abstract class EmployeeState extends Equatable {
  EmployeeState([List props = const []]) : super(props);

  @override
  String toString() => '$runtimeType{}';
}

class EmployeeLoaded extends EmployeeState{
  EmployeeLoaded(this.employees):super([employees])

  final List<Employee> employees;
}

要获得更多信息/帮助,您可以访问bloc 吉特

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57005313

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档