无法在 Flutter 的 showModal 上下文中访问 bloc
Can't access bloc in showModal context in Flutter
我用dart BlocProvider<ABloc,AState>
包裹我的脚手架
但是当我使用 showDialog func 和 showDialog 我想从上下文或 BlocBuilder 访问 ABloc
不包含 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
,因此您需要将 bloc
实例注入 Dialog
]的context
.
相反,使用 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()),
),
),
)),
),
),
)));
我用dart BlocProvider<ABloc,AState>
包裹我的脚手架
但是当我使用 showDialog func 和 showDialog 我想从上下文或 BlocBuilder 访问 ABloc
不包含 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
,因此您需要将 bloc
实例注入 Dialog
]的context
.
相反,使用 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()),
),
),
)),
),
),
)));