模态底部 Sheet 和 Bloc
Modal Bottom Sheet and Bloc
当我 运行 代码类似于以下代码时出现以下错误:使用不包含 Bloc 的上下文调用 BlocProvider.of()。
复制
BlocProvider(
create: (context) => getIt<TheBloc>()
child: BlocBuilder<TheBloc, TheState>(
build: (context, state) =>
MaterialButton(
onPressed: () => _showModal(context),
child: const Text('SHOW BLOC MODAL'),
),
...
void _showModal(BuildContext context) {
showModalBottomSheet<void>(
context: context,
builder: (_) {
return MaterialButton(
onPressed() {
context.bloc<TheBloc>().add(
TheEvent.someEvent(),
);
}
child: Text('Press button to add event to bloc')
);
},
);
}
您需要用 BlocProvider.value 包装 showModalBottomSheet 的构建器,如下所示:
由于上下文是新的。
return BlocProvider.value(
value: BlocProvider.of<TheBloc>(context),
child: MaterialButton( ...
...
实际上,如果您仅在底部 sheet 而不需要此 bloc,则更好和更清晰的解决方案是为底部 sheet 内容创建 StatefullWidget,在 [=] 中的此小部件内创建 Bloc 11=] 在 build()
方法中使用 bloc,在 dispose()
方法中使用资源。
showModalBottomSheet<void>(
context: context,
builder: (_) {
return MyBottomSheet(); // your stateful widget
);
},
);
像上面那样使用 bloc 保证你的 bloc 状态在每次 showModalBottomSheet
调用时都是相同的
注意。如果你需要保留 bloc 的状态,你可以尝试使用 AutomaticKeepAliveClientMixin
(未测试)
当我 运行 代码类似于以下代码时出现以下错误:使用不包含 Bloc 的上下文调用 BlocProvider.of()。
复制
BlocProvider(
create: (context) => getIt<TheBloc>()
child: BlocBuilder<TheBloc, TheState>(
build: (context, state) =>
MaterialButton(
onPressed: () => _showModal(context),
child: const Text('SHOW BLOC MODAL'),
),
...
void _showModal(BuildContext context) {
showModalBottomSheet<void>(
context: context,
builder: (_) {
return MaterialButton(
onPressed() {
context.bloc<TheBloc>().add(
TheEvent.someEvent(),
);
}
child: Text('Press button to add event to bloc')
);
},
);
}
您需要用 BlocProvider.value 包装 showModalBottomSheet 的构建器,如下所示: 由于上下文是新的。
return BlocProvider.value(
value: BlocProvider.of<TheBloc>(context),
child: MaterialButton( ...
...
实际上,如果您仅在底部 sheet 而不需要此 bloc,则更好和更清晰的解决方案是为底部 sheet 内容创建 StatefullWidget,在 [=] 中的此小部件内创建 Bloc 11=] 在 build()
方法中使用 bloc,在 dispose()
方法中使用资源。
showModalBottomSheet<void>(
context: context,
builder: (_) {
return MyBottomSheet(); // your stateful widget
);
},
);
像上面那样使用 bloc 保证你的 bloc 状态在每次 showModalBottomSheet
调用时都是相同的
注意。如果你需要保留 bloc 的状态,你可以尝试使用 AutomaticKeepAliveClientMixin
(未测试)