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