我正在使用flutter_bloc软件包来管理我的应用程序中的状态。我有一个用例,必须从远程数据库加载初始状态。这要求initialState方法是异步的,实际上不是。
如果不使用initialState方法,从远程数据库加载Bloc初始状态的最佳方法是什么?
答案 0 :(得分:6)
您可以将event
发送到bloc
以开始加载(在此事件上,团体发送新的LoadingState
),您会在此处接收并显示Loader
,然后在加载结束时bloc
发送另一个带有数据的状态,您只需将加载状态切换为已加载(并显示数据)即可。 您不需要等待呼叫,只需要做的就是推送和接收状态
答案 1 :(得分:4)
综合说明:
initialState
插件中Bloc
的{{1}} 必须同步。
因为在实例化Bloc时必须有一个立即可用的初始状态。
因此,如果要从异步源获得状态,则可以在flutter_bloc
函数内部调用异步函数,并在工作完成时发出新状态。
常规步骤:
步骤(1):
使用所需的事件和状态创建自己的Bloc类。
mapEventToState
其中class YourBloc extends Bloc<YourEvent, YourState> {
@override
YourState get initialState => LoadingState();
@override
Stream<YourState> mapEventToState(YourEvent event) async* {
if (event is InitEvent) {
final data = await _getDataFrom_SharedPreferences_OR_Database_OR_anyAsyncSource();
yield LoadedState(data);
}
}
}
和LoadingState
可以是LoadedState
类的子类或相同类型,并且可以具有不同的属性以供以后在小部件中使用。
同样,YourState
和其他事件也会吃InitEvent
类的子类,或者只是一个枚举。
步骤(2):
现在,当您要创建YourEvent
小部件时,可以立即添加BlocProvider
,如下所示:
initEvent
步骤(3):
使用不同的状态显示不同的小部件:
BlocProvider<YourBloc>(
create: (_) => YourBloc()..add(InitEvent()),
child: YourChild(),
)
实际示例:
请假设我们在购物应用中的每个产品都有一个计数器(+/-),并且我们希望将选定的商品计数保存在BlocBuilder<YourBloc, YourState>(
builder: (context, state) {
if (state is LoadingState) {
return Center(child: CircularProgressIndicator(),);
}
if (state is LoadedState) {
return YourWidget(state.data);
}
}
)
或SharedPreferences
中(您可以使用任何异步数据源)。这样,只要用户打开该应用,他/她就可以看到所选项目的计数。
database
答案 2 :(得分:0)
另一个选项可能是,例如,在配置文件中进行依赖注入时,您可以等待那里的状态。然后,该状态会传入bloc的构造函数中。因此,现在在集团中,您可以轻松地将initialState
指向您传入的那个。
是的,您必须记住,准备好数据后应更改初始状态。
现在,我为这种情况提供一个用例。 您可能已经为用户显示了基本选项或设置。您从初始状态获得的简单数据。 然后是下一个状态:例如,加载状态可以显示背景具有某种不透明度的加载指示器。在加载更多需要的数据时,用户已经可以看到基本选项。