一尘不染

如何访问showModalBottomSheet中的Provided(Provider.of())值?

flutter

我有一个FloatingActionButton具有一个widget树内BlocProviderflutter_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


注意:这不限于BlocProviderflutter_bloc。提供程序包中的任何提供程序都具有相同的行为。

我怎样才能访问BlocProvider.of<SomeBloc>(context)里面的showModalBottomSheet

如果无法做到这一点,如何使解决方案适应模式底部表?


阅读 773

收藏
2020-08-13

共1个答案

一尘不染

InheritedWidgets以及Providers的范围都限于小部件树。无法在该树之外访问它们。

问题是,使用showDialog类似的功能,对话框位于不同的小部件树中-可能无法访问所需的提供程序。

因此,有必要在新的窗口小部件树中添加所需的提供程序:

void myShowDialog() {
  final myModel = Provider.of<MyModel>(context, listen: false);
  showDialog(
    context: context,
    builder: (_) {
      return Provider.value(value: myModel, child: SomeDialog());
    },
  );
}
2020-08-13