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

Hen*_*hur 17 flutter bloc flutter-provider

我在一个小部件树中有一个 FloatingActionButton ,它有一个BlocProviderfrom 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),
    ),
  )
);
Run Code Online (Sandbox Code Playgroud)

这将打开一个模态底部工作表:

void _openFilterSchedule() {
    showModalBottomSheet<void>(
      context: context,
      builder: (BuildContext context) {
        return TheBottomSheet();
      },
    );
  }
Run Code Online (Sandbox Code Playgroud)

我正在尝试SomeBloc使用BlocProvider.of<SomeBloc>(context)inside访问,TheBottomSheet但出现以下错误:

BlocProvider.of() called with a context that does not contain a Bloc of type SomeBloc.
Run Code Online (Sandbox Code Playgroud)

我曾尝试使用/sf/answers/3957352801/ 中描述的解决方案,但仅适用于BottomSheet而不适用于ModalBottomSheet


注意:这不限于BlocProviderflutter_blocprovider包中的任何 Provider都具有相同的行为。

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

如果无法做到这一点,如何将/sf/answers/3957352801/解决方案适应Modal Bottom Sheet?

Rém*_*let 40

InheritedWidgets 和 Providers 的作用域是小部件树。不能在该树之外访问它们。

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

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

void myShowDialog() {
  final myModel = Provider.of<MyModel>(context, listen: false);
  showDialog(
    context: context,
    builder: (_) {
      return Provider.value(value: myModel, child: SomeDialog());
    },
  );
}
Run Code Online (Sandbox Code Playgroud)

  • 如果我这样做,它会显示“未处理的异常:错误:无法在此页面小部件上方找到正确的提供者&lt;模型&gt;” (3认同)

小智 13

showModalBottomSheet(底页)中的提供者

void myBottomSheet() {
  final myModel = Provider.of<MyModel>(context, listen: false);
  showModalBottomShee(
    context: context,
    builder: (_) {
      return ListenableProvider.value(
        value: myModel,
        child: Text(myModel.txtValue),
      );
    },
  );
}
Run Code Online (Sandbox Code Playgroud)


CH *_*ing 7

您需要将 Provider 移动到顶层(MaterialApp)

根据图片,Dialog 小部件位于 MaterialApp 下,所以这就是您使用错误上下文的原因

在此输入图像描述