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

标签 flutter bloc flutter-provider

我在小部件树中有一个 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 .


注意:这不限于 BlocProviderflutter_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/

相关文章:

Flutter:ClipPath()小部件中的断言失败错误

android - Flutter build apk 有 bug 而 debug 很完美

flutter - 单 View flutter 的提供者

firebase - Flutter Provider显示来自错误用户的数据

flutter - Flutter:弹出导航时未调用内部版本

flutter - 从 FlatButton 迁移到 TextButton 时如何指定 disabledTextColor

firebase - 'String'类型不是 'double'类型的子类型

flutter + Bloc 6.0.6。 BlocBuilder 的 "builder"回调未提供与 "buildWhen"回调相同的状态

flutter - Flutter Bloc-按钮未触发状态更改

FlutterBloc 对 Blocs 的初始状态使用react