gpt4 book ai didi

flutter - 改变 flutter_bloc 中的 `currentState` 属性

转载 作者:行者123 更新时间:2023-12-02 19:56:03 24 4
gpt4 key购买 nike

我有一个 flutter 应用程序,在其中我在 listView 小部件中显示员工列表及其姓名和销售额。我为每个员工提供了两个按钮来增加或减少他们的销售额。

我正在使用flutter_bloc用于状态管理。

这是 Employee 类。

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;
}

这是作为事件的类。

@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);
}

这是处理状态的 bloc 类。

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 但我无法增加或减少特定索引处员工的销售额。

@override
Stream<List<Employee>> mapEventToState(EmployeeEvent event) async* {
if (event is IncrementEvent) {
yield currentState;
} else if (event is DecrementEvent) {
yield currentState;
}
}

如何增加或减少特定指数下特定员工的销售额?

最佳答案

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

为了全局的理解:

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

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

如果您想使用相同的实例,您可以扩展 Equatable (来自 equatablehere )或执行与它相同的操作。 ( this 中等帖子可以帮助您)。

根据您的情况,您可以这样做:

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 gitter .

关于flutter - 改变 flutter_bloc 中的 `currentState` 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57005313/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com