flutter - 无法在 Flutter 的 showModal 上下文中访问 bloc

标签 flutter dart flutter-bloc

我用 dart BlocProvider<ABloc,AState> 包裹我的脚手架
但是当我使用 显示对话 功能和 显示对话 我想从上下文访问 ABloc 或 BlocBuilder
不包含 block 并抛出错误
在这种情况下有没有办法访问 bloc
(在我的对话框中,我显示了获取用户名的文本,所以我想访问 bloc)

class MyHomePageState extends StateLessWidget {
  @override
  Widget build(BuildContext context) {
    return BlocProvider(
        lazy: false,
        create: (context) => EditColorBloc(context.bloc<RetrieveColorBloc>()),
        child: MainScafold());
  }
}
class MainScafold extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("sina"),
      ),
      floatingActionButton:FloatingActionButton(
            child: Icon(Icons.add),
            onPressed: () => showDialog(
              context: context,
              builder: (ctx) {
              // show dialog and use 
              // context o BlocBuilder to access 
              // EditColorBloc
              // throw error BlocProvider.of() called with a context that does 
              // not contain a Cubit of type EditColorBloc
              }
           )
  }
}

最佳答案

更新 v6.1.0
(归功于 @Sebastian Dennis )context.bloc已弃用,取而代之的是提供者的 context.read , context.watch , 和 context.select .在下面的代码中,只需更改 context.bloc<TestBloc>context.read<TestBloc>
你不应该使用 BlocBuilder包装 Dialog .原因是您(很可能)没有重建整个 Dialog每当发生变化时。另一个更重要的原因是您的 Dialog正在构建中不包含您的 bloc ,所以你需要注入(inject)你的bloc实例到 Dialogcontext .
相反,请使用 BlocProvider.value并设置 value BlocProvider.of(context) 的参数(又名 context.bloc() ),并确保上下文不是 showDailog的方法上下文,但是原来build中的上下文方法。
这是一个工作示例。您只需更改 TestBlocTestState等到你自己的Bloc实例:

  @override
  Widget build(BuildContext context) {
    return BlocProvider<TestBloc>(
        create: (context) => TestBloc(InitTestState()),
        child: Scaffold(
            body: BlocBuilder<TestBloc, TestState>(
              builder: (context, state) => Center(
                child: FlatButton(
                  child: Text("Show Dialog"), 
                  onPressed: () => showDialog(
                      context: context, 

                      // Relavent code change here
                      builder: (ctx) => BlocProvider<TestBloc>.value(
                        value: context.bloc<TestBloc>(), 

                        child: Dialog(
                          child: FlatButton(
                            child: Text("Notify bloc"),
                            onPressed: () => context
                                .bloc<TestBloc>()
                                .add(TestEvent()),
                          ),
                        ),
                      )),
            ),
          ),
        )));

关于flutter - 无法在 Flutter 的 showModal 上下文中访问 bloc,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63919070/

相关文章:

flutter - 带有 Google 登录帐户的 Google API

flutter - setState()在抖动中无法正常工作

firebase - 注销 Flutter 应用程序不会返回登录页面

firebase - 如果在 Flutter 应用程序中是否存在 firestore 数据库集合,如何检查文档是否存在?

dart - 更改 Dart 格式样式

flutter - 嵌套 BlocBuilders 以管理同一个小部件上的多个状态

firebase - cloud_firestore_platform_interface:我们是否应该立即从此软件包中执行所有firestore操作?

javascript - flutter(Dart)有没有类似js bind的功能?

flutter - 如何在 Flutter App 中正确使用 BlocListener 和 BlocProvider

flutter - 如何在一个区 block 中收听多个流订阅?