问题描述
我用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
方法中的上下文。
这是一个有效的示例。您只需将build
或TestBloc
等更改为您自己的TestState
实例:
Bloc