调度第一个 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: (_) =&gt; ProfileBloc(ProfileLoading()), // lazy: , child: Consumer&lt;BaseModel&gt;( builder: (context, basemodel, _) return MaterialAppWidget(); , ), ),@SardorbekRkh 如果是,那么您可以像BlocProvider.of&lt;ProfileBloc&gt;(context).add(ProfileInitialEvent()); 一样。这还将初始事件添加到您要使用该块的块中。谢谢。

以上是关于调度第一个 bloc 事件或 cubit 方法,在 StatelessWidget 内的页面开始的主要内容,如果未能解决你的问题,请参考以下文章

使用相同 Bloc/Cubit 的多个 BlocBuilder,每个 BlocBuilder 用于不同的事件

Flutter BLoC:Cubits 比 BLoC 好吗?

使用 Bloc/Cubit 进行 Flutter 状态管理

在 Flutter 中使用 Bloc/Cubit 时绕过 CONTEXT

我应该先启动 Cubit,然后再将代码重构为 Bloc 吗?

Flutter BLoC 库:将 TextEditingController 对象保存在哪里:在 State、BLoC / Cubit 类中还是在小部件中?