无法在showModal上下文中访问bloc

问题描述

我用dart BlocProvider<ABloc,AState>包裹 scafflod 但是当我使用 showDialog 函数 showDialog 时,我想从上下文或 BlocBuilder 中访问ABloc。 不包含块并抛出错误 在这种情况下有没有办法进入集团 (在对话框中,我显示了要获取用户名的文本字段,因此我想访问集团)

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
              }
           )
  }
}

解决方法

您不应使用BlocBuilder来包装Dialog。原因是,每当发生更改时,您(很可能)不会重建整个Dialog。另一个更重要的原因是,构建Dialog的上下文不包含bloc,因此您需要将bloc实例注入{{1} }的Dialog

相反,请使用context并将BlocProvider.value参数设置为value(又名BlocProvider.of(context)),并确保上下文不是context.bloc()的方法上下文,但是原始showDailog方法中的上下文。

这是一个有效的示例。您只需将buildTestBloc等更改为您自己的TestState实例:

Bloc