flutter -如何在AlertDialog中显示块状态

g6baxovj  于 2023-04-22  发布在  Flutter
关注(0)|答案(3)|浏览(127)

我有一个非常简单的应用程序,使用开关和块状态管理。开关状态管理工作,但我想通过AlertDialog向用户显示开关状态。
以下是switch widget:

@override
  Widget build(BuildContext context) {
    return BlocProvider(
      create: (_) => SwitchCubit(),
      child: BlocBuilder<SwitchCubit, bool>(
        builder: (context, state) {
          return Switch(
            value: state,
            activeColor: Colors.green,
            onChanged: (bool value) {
              // This is called when the user toggles the switch.
              BlocProvider.of<SwitchCubit>(context).toggle();
            },
          );
        },
      ),
    );
  }

这里是我试图向用户显示开关状态的方式(true或false)。

appBar: AppBar(
  title: const Text('Switch bloc test'),
  actions: [
    IconButton(
      icon: const Icon(Icons.info),
      tooltip: 'Switch bloc test',
      onPressed: () {
        showDialog(
          context: context,
          builder: (context) {
            return Material(
              child: BlocBuilder<SwitchCubit, bool>(
                builder: (context, state) => AlertDialog(
                  content: Text(state.toString()),
                ),
              ),
            );
          },
        );
      },
    ),
  ],
),

我应该如何继续并避免得到这个?

项目源代码:https://github.com/Kalyxt/switchbloc_flutter

mfuanj7w

mfuanj7w1#

你必须向AlertDialog提供Bloc/Cubit。这是因为它在对话框中是一个不同的BuildContext。
使用BlocProvider将Material小部件 Package 在showDialog方法中,并在其中提供SwitchCubit。
类似于我在这里描述的解决方案:
使用Modal底表处理BlocProvider

编辑:

1.不要创建新的SwitchCubit。提供一个已经存在的SwitchCubit。
1.确保在小部件树中在此之上创建了现有的SwitchCubit。
1.重命名内部构建上下文,以便在向对话框提供Bloc/Cubit时使用正确的BuildContext。

showDialog(
   context: context,
   builder: (innerContext) {
     return BlocProvider.value(
       value: context.watch<SwitchCubit>(),
       child: Material(
         child: BlocBuilder<SwitchCubit, bool>(
           builder: (context, state) => AlertDialog(
             content: Text(state.toString()),
           ),
         ),
       ),
     );
   },
 );

**注意:**如果你现在遇到同样的错误,那么你还没有完成上面的第2项。

yjghlzjz

yjghlzjz2#

尝试添加一个额外的构建器,以获得创建的SwitchCubit的新上下文

return BlocProvider(
      create: (_) => SwitchCubit(),
      child: Builder(
        builder: (context) {
          return BlocBuilder<SwitchCubit, bool>(
            builder: (context, state) {
              return Switch(
                value: state,
                activeColor: Colors.green,
                onChanged: (bool value) {
                  // This is called when the user toggles the switch.
                  BlocProvider.of<SwitchCubit>(context).toggle();
                },
              );
            },
          );
        },
      ),
    );
    ```
x0fgdtte

x0fgdtte3#

您在不同的路由中使用了块提供程序,因此状态无法找到提供程序,在main中使用提供程序,然后树中的所有小部件都可以访问它

相关问题