如何访问showModalBottomSheet中的Provided(Provider.of())值?
问题内容:
我有一个FloatingActionButton具有一个widget树内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)
inside
访问,TheBottomSheet
但是出现以下错误:
BlocProvider.of() called with a context that does not contain a Bloc of type SomeBloc.
我尝试使用描述的解决方案,但仅适用于BottomSheet
而不适用ModalBottomSheet
。
注意:这不限于BlocProvider
或flutter_bloc
。提供程序包中的任何提供程序都具有相同的行为。
我怎样才能访问BlocProvider.of<SomeBloc>(context)
里面的showModalBottomSheet
?
如果无法做到这一点,如何使解决方案适应模式底部表?
问题答案:
InheritedWidgets以及Providers的范围都限于小部件树。无法在该树之外访问它们。
问题是,使用showDialog
类似的功能,对话框位于不同的小部件树中-可能无法访问所需的提供程序。
因此,有必要在新的窗口小部件树中添加所需的提供程序:
void myShowDialog() {
final myModel = Provider.of<MyModel>(context, listen: false);
showDialog(
context: context,
builder: (_) {
return Provider.value(value: myModel, child: SomeDialog());
},
);
}