我正在应用程序的小部件树深处创建一个 AlertDialog
,并使用 Bloc 包通过单击 AlertDialog 中的按钮来发出事件。
问题是 AlertDialog 位于小部件树中 MaterialApp 的正下方,因此无法在上下文中找到我的 BlocProvider,因为我在小部件树的下方进一步定义了它。我也无法将 BlocProvider 移动到全局可用,因为此提供的 bloc 依赖于只能在小部件树下方进一步访问的状态。
这是我使用 TextField 调用 AlertDialog 的函数,它发出一个事件 onChanged
:
showDialog(
context: context,
builder: (context) => AlertDialog(
title: const Text("Create Patient Questionnaire"),
content: Column(
mainAxisSize: MainAxisSize.min,
children: [
const Text("Give your patient Questionnaire a name!"),
UniversalTextField(
prefixText: "Name",
onChanged: (value) => context
.read<CreatePQBloc>()
.add(CreatePQDocumentNameChanged(documentName: value)),
),
],
),
),
);
我很想知道是否可以更改小部件树中 AlertDialog 的位置,或者是否有人知道解决此问题的方法。
答案 0 :(得分:1)
我通过将 useRootNavigator
的参数 showDialog
设置为 false 解决了我的问题,这导致 AlertDialog 位于小部件树的更下方,在我的情况下,在访问所有必要的依赖。
showDialog(
context: context,
useRootNavigator: false,
builder: (context) => AlertDialog(
title: const Text("Create Patient Questionnaire"),
content: Column(
mainAxisSize: MainAxisSize.min,
children: [
const Text("Give your patient Questionnaire a name!"),
UniversalTextField(
prefixText: "Name",
onChanged: (value) => context
.read<CreatePQBloc>()
.add(CreatePQDocumentNameChanged(documentName: value)),
),
],
),
),
);
我也可以使用 BlocProvider 将 Column
包装在内容中,但根据我上面的回答,我不需要在小部件树中两次提供 bloc。