小部件树中 AlertDialog 的颤动更改位置

时间:2021-05-24 21:27:54

标签: flutter dart

我正在应用程序的小部件树深处创建一个 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 的位置,或者是否有人知道解决此问题的方法。

1 个答案:

答案 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。