Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter can';在showmodel上下文中不访问bloc_Flutter_Dart_Flutter Bloc - Fatal编程技术网

Flutter can';在showmodel上下文中不访问bloc

Flutter can';在showmodel上下文中不访问bloc,flutter,dart,flutter-bloc,Flutter,Dart,Flutter Bloc,我用dart BlocProvider 但当我使用showDialogfunc和showDialog时,我希望从上下文或BlocBuilder访问ABloc 不包含bloc和throw错误 在这种情况下有办法进入集团吗 (在我的对话框中,我显示文本字段以获取用户名,因此我想访问bloc) 您不应该使用BlocBuilder包装对话框。原因是,无论何时发生更改,您(很可能)都不会重建整个对话框。另一个更重要的原因是,构建对话框的上下文不包含bloc,因此需要将bloc实例注入对话框的上下文中 相反

我用
dart BlocProvider
但当我使用showDialogfunc和showDialog时,我希望从上下文或BlocBuilder访问ABloc 不包含bloc和throw错误 在这种情况下有办法进入集团吗 (在我的对话框中,我显示文本字段以获取用户名,因此我想访问bloc)


您不应该使用
BlocBuilder
包装
对话框
。原因是,无论何时发生更改,您(很可能)都不会重建整个
对话框。另一个更重要的原因是,构建
对话框的上下文不包含
bloc
,因此需要将
bloc
实例注入
对话框的
上下文中

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

下面是一个工作示例。您只需将
TestBloc
TestState
等更改为您自己的
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()),
                          ),
                        ),
                      )),
            ),
          ),
        )));
@覆盖
小部件构建(构建上下文){
返回BlocProvider(
create:(context)=>TestBloc(InitTestState()),
孩子:脚手架(
正文:BlocBuilder(
生成器:(上下文,状态)=>中心(
孩子:扁平按钮(
子项:文本(“显示对话框”),
onPressed:()=>showDialog(
上下文:上下文,
//此处更改相关代码
生成器:(ctx)=>BlocProvider.value(
值:context.bloc(),
子:对话框(
孩子:扁平按钮(
子:文本(“通知集团”),
onPressed:()=>上下文
.集团()
.add(TestEvent()),
),
),
)),
),
),
)));

谢谢,伙计,我使用对话框上下文,但我认为对话框上下文不包含scafold上下文,而使用MaterialApp上下文另一个我的问题是使用BlocProvider.value的BlocProvider istead
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
              }
           )
  }
}
  @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()),
                          ),
                        ),
                      )),
            ),
          ),
        )));