我有一个关于块正确代码放置的问题,可以这么说。
因此,由于bloc代表业务逻辑组件,因此我已在类内部移动了业务逻辑(例如处理数据方法)。因此,现在有2种方法,一种用于获取,另一种用于保存数据。
接下来,我有我的组件,该组件应在AddInitial
中显示正在加载的内容,然后在火灾集团中说“嘿,我在这里需要数据”。是正确的还是反模式?代码看起来像这样。
BlocBuilder<AddBloc, AddState>(
buildWhen: (previous, current) {
// code is ommited
},
builder: (context, state) {
if (state is ExpensesLoaded || state is CategoryChanged) {
// code is ommited
} else if (state is ExpensesLoading) {
return getProgressSpinner();
} else if (state is AddInitial) {
// is it ok? If it's antipattern please give an advise how to do it correctly
context.bloc<AddBloc>().add(CategoryChange([category]));
return getProgressSpinner();
} else {
print('Bloc Loaded. Nothing to show inside Month Expenses...');
return Container();
}
}
关于context.bloc<AddBloc>().add(CategoryChange([category]));
的问题。是反模式吗?应该怎么做?
当它看起来像这样时。下次当我将CategoryChange
事件添加到bloc(将产生CategoryChanged
状态)时,由于某种原因,上面的生成器没有反应...
谢谢!
我正在使用Flutter 1.22.3,flutter_bloc:6.1.0
答案 0 :(得分:0)
这应该怎么做?
当您在创建Bloc时知道其初始状态(假设静态列表中默认情况下已预先选择第一个条目),则可以使用将初始状态作为参数的Bloc构造函数。
如果您不知道正确的初始状态是什么,因为它是动态的(请说一下,基于GPS的服务从加载的位置列表中,用户必须点击按钮才能获得,因为这要花钱)那么最好具有“空”或“未初始化”或“ waitingForUserInteraction”状态。毕竟,那 就是程序的状态。
当它看起来像这样时。下次我将CategoryChange事件添加到bloc(将产生CategoryChanged状态)构建器时,由于某种原因,它没有反应
集团通过比较旧状态和新状态来确定是否发出新状态更改。如果要修改默认行为,可以确保两个状态比较相等(或不相等)。最简单的方法是像这样从包equatable中的Equatable
得出状态:
@immutable
abstract class SomeState extends Equatable {
final String importantChange;
final String unimportantChange;
const SomeState(this.importantChange, this.unimportantChange);
@override
List<Object> get props => [importantChange];
}
仅在“ props”列表中列出一个字段意味着在比较是否相等时仅对此进行比较。如果importantChange
相等,则认为状态相等(并且不会从Bloc中发出)。 importantChange
相同但unimportantChange
不同的两个状态被视为相同。