flutter_bloc:使initialState方法异步

时间:2020-02-24 05:57:32

标签: flutter bloc flutter-bloc

我正在使用flutter_bloc软件包来管理我的应用程序中的状态。我有一个用例,必须从远程数据库加载初始状态。这要求initialState方法是异步的,实际上不是。

如果不使用initialState方法,从远程数据库加载Bloc初始状态的最佳方法是什么?

3 个答案:

答案 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指向您传入的那个。

是的,您必须记住,准备好数据后应更改初始状态。

现在,我为这种情况提供一个用例。 您可能已经为用户显示了基本选项或设置。您从初始状态获得的简单数据。 然后是下一个状态:例如,加载状态可以显示背景具有某种不透明度的加载指示器。在加载更多需要的数据时,用户已经可以看到基本选项。