我有一个非常简单的应用程序,使用开关和块状态管理。开关状态管理工作,但我想通过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()),
),
),
);
},
);
},
),
],
),
我应该如何继续并避免得到这个?
3条答案
按热度按时间mfuanj7w1#
你必须向AlertDialog提供Bloc/Cubit。这是因为它在对话框中是一个不同的BuildContext。
使用BlocProvider将Material小部件 Package 在showDialog方法中,并在其中提供SwitchCubit。
类似于我在这里描述的解决方案:
使用Modal底表处理BlocProvider
编辑:
1.不要创建新的SwitchCubit。提供一个已经存在的SwitchCubit。
1.确保在小部件树中在此之上创建了现有的SwitchCubit。
1.重命名内部构建上下文,以便在向对话框提供Bloc/Cubit时使用正确的BuildContext。
**注意:**如果你现在遇到同样的错误,那么你还没有完成上面的第2项。
yjghlzjz2#
尝试添加一个额外的构建器,以获得创建的SwitchCubit的新上下文
x0fgdtte3#
您在不同的路由中使用了块提供程序,因此状态无法找到提供程序,在main中使用提供程序,然后树中的所有小部件都可以访问它