无法在带有flutter_bloc的模式中访问cubit

x7rlezfr  于 2023-05-29  发布在  Flutter
关注(0)|答案(1)|浏览(115)

我有下面的无状态小部件。我尝试使用BlocProvider.of<SettingsCubit>(context).updateSettings(newSettings);访问SettingsOverlay类中的SettingsCubit,但它抛出ProviderNotFoundException。也尝试使用MaterialPageRoute而不是模态,但它有同样的问题。
MovieBloc在带有BlocBuilderMovieList小部件中正常工作,并按要求刷新。
我说的对吗,这与MovieList和BlocProvider在同一个小部件树中有关,而模态/新页面是一个不同的(子)树?如果是这样,BlocProvider.value不应该将数据传递给SettingsOverlay吗?
下面是widget的完整代码:

class MovieScreen extends StatelessWidget {
  const MovieScreen({super.key});

  @override
  Widget build(BuildContext context) {
    return MultiBlocProvider(
      providers: [
        BlocProvider<SettingsCubit>(
          create: (_) => SettingsCubit(),
        ),
        BlocProvider<MovieBloc>(
          create: (_) =>
              MovieBloc(httpClient: http.Client())..add(MovieFetched()),
        )
      ],
      child: Scaffold(
        appBar: AppBar(
          title: const Text('Movies'),
          actions: [
            IconButton(
              onPressed: () => {
                showModalBottomSheet(
                  useSafeArea: true,
                  context: context,
                  builder: (_) {
                    return BlocProvider.value(
                      value: context.read<SettingsCubit>(),
                      child: const SettingsOverlay(),
                    );
                  },
                ),
              },
              icon: const Icon(Icons.add),
            ),
          ],
        ),
        body: const MovieList(),
      ),
    );
  }
}
class SettingsOverlay extends StatelessWidget {
  const SettingsOverlay({super.key});

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text("Settings")),
      body: Column(
        children: [
          ElevatedButton(
            onPressed: () {
              print("save");

              BlocProvider.of<SettingsCubit>(context)
                  .updateSettings(Settings());
            },
            child: const Text("Save"),
          ),
        ],
      ),
    );
  }
}
rm5edbpk

rm5edbpk1#

问题是在您刚刚创建的同一上下文上阅读SettingsCubitcontext.read将查找小部件树(不是当前的)。
您可以为单独的上下文添加另一个构建器。

Builder(builder: (context) {
              return IconButton(
                onPressed: () {
                  showModalBottomSheet(
                    useSafeArea: true,
                    context: context,
                    builder: (_) {
                      return BlocProvider.value(
                        value: context.read<SettingsCubit>(),
                        child: const SettingsOverlay(),
                      );
                    },
                  );
                },
                icon: const Icon(Icons.add),
              );
            }),

相关问题