我在小部件树中有一个 FloatingActionButton,它有一个 BlocProvider
来自 flutter_bloc .像这样:
BlocProvider(
builder: (context) {
SomeBloc someBloc = SomeBloc();
someBloc.dispatch(SomeEvent());
return someBloc;
},
child: Scaffold(
body: ...
floatingActionButton: FloatingActionButton(
onPressed: _openFilterSchedule,
child: Icon(Icons.filter_list),
),
)
);
打开模态底页:
void _openFilterSchedule() {
showModalBottomSheet<void>(
context: context,
builder: (BuildContext context) {
return TheBottomSheet();
},
);
}
我正在尝试访问 SomeBloc
使用 BlocProvider.of<SomeBloc>(context)
里面TheBottomSheet
但我收到以下错误:
BlocProvider.of() called with a context that does not contain a Bloc of type SomeBloc.
我已尝试使用 https://stackoverflow.com/a/56533611/2457045 中描述的解决方案但只适用于 BottomSheet
而不是 ModalBottomSheet
.
注意:这不限于 BlocProvider
或 flutter_bloc
.来自 provider 的任何提供商包具有相同的行为。
如何访问 BlocProvider.of<SomeBloc>(context)
在showModalBottomSheet
里面?
如果无法做到这一点,如何调整 https://stackoverflow.com/a/56533611/2457045 Modal Bottom Sheet 的解决方案?
最佳答案
InheritedWidgets 以及 Provider 的范围都限定在小部件树中。无法在该树之外访问它们。
问题是,使用 showDialog
和类似的功能,对话框位于不同的小部件树中——它可能无法访问所需的提供程序。
因此有必要在新的小部件树中添加所需的提供者:
void myShowDialog() {
final myModel = Provider.of<MyModel>(context, listen: false);
showDialog(
context: context,
builder: (_) {
return Provider.value(value: myModel, child: SomeDialog());
},
);
}
关于flutter - 如何访问 showModalBottomSheet 中提供的 (Provider.of()) 值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57547784/