调度第一个 bloc 事件或 cubit 方法,在 StatelessWidget 内的页面开始
Posted
技术标签:
【中文标题】调度第一个 bloc 事件或 cubit 方法,在 StatelessWidget 内的页面开始【英文标题】:Dispatch first bloc event or cubit method, on page start inside StatelessWidget 【发布时间】:2021-01-06 21:29:34 【问题描述】:我的应用程序主菜单中有 10 个按钮,每个按钮都包含 BlocBuilder。
所以当我点击这些按钮打开一个新页面时,我想调度第一个事件,但我不知道如何。我可以将所有类更改为有状态小部件,然后在 initialState() 函数中调用 bloc.dispatch(event),但我想发现另一种方法,不确定是否这是最好的方法
【问题讨论】:
请出示您的代码,以便我们知道从哪里开始 【参考方案1】:为了触发 BlocBuilder 中的第一个事件/方法调用,我必须添加 bloc 参数并提供我的 BlocProvider 提供的参数,只有在此之后我才设法调用我的方法。
BlocBuilder<MyCubit, MyState>(
bloc: BlocProvider.of<MyCubit>(context)..myFunction(),
builder: (BuildContext context, state)
//Your code...
【讨论】:
但是 blocListener 中缺少第一个状态 对我来说,我必须添加bloc
参数。【参考方案2】:
你可以使用 .. 操作符在声明 like 的同时添加事件
BlocProvider(
create: (context) => FirstBloc()..add(InitialiEvent()), // <-- first event,
child: BlocBuilder<FirstBloc, FirstState>(
builder: (BuildContext context, state)
...
,
),
或者您也可以在 initState
方法中执行此操作
【讨论】:
它仍然可以在不使用 statefull 小部件的情况下实现。因为建议尽可能避免使用有状态小部件,因此如果不需要使用有状态小部件,请将其保留为无状态 它不起作用,可能是因为我的 BlocProvider 包装了 MaterialApp。在我的情况下, BlocProvider 没有像您的示例中那样包装 BlocBuilder 你的意思是这样。?BlocProvider( create: (_) => ProfileBloc(ProfileLoading()), // lazy: , child: Consumer<BaseModel>( builder: (context, basemodel, _) return MaterialAppWidget(); , ), ),
@SardorbekRkh
如果是,那么您可以像BlocProvider.of<ProfileBloc>(context).add(ProfileInitialEvent());
一样。这还将初始事件添加到您要使用该块的块中。谢谢。以上是关于调度第一个 bloc 事件或 cubit 方法,在 StatelessWidget 内的页面开始的主要内容,如果未能解决你的问题,请参考以下文章
使用相同 Bloc/Cubit 的多个 BlocBuilder,每个 BlocBuilder 用于不同的事件
Flutter BLoC:Cubits 比 BLoC 好吗?
在 Flutter 中使用 Bloc/Cubit 时绕过 CONTEXT
我应该先启动 Cubit,然后再将代码重构为 Bloc 吗?
Flutter BLoC 库:将 TextEditingController 对象保存在哪里:在 State、BLoC / Cubit 类中还是在小部件中?