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()),
),
),
)),
),
),
)));