Riverpod / Flutter 在 Consumer 类中使用 showDialog

ImE*_*ban 5 dart flutter riverpod

我不确定我错过了什么,我有一个带有返回对话框的 Consumer 类的简单方法,但问题如下

根据闭包上下文的要求,返回类型“Future”不是“Widget”。

它指向下面所示的线。

  func() {
    Consumer(builder: (context, ref, _) {
      return showDialog(     // <- [ERROR HERE]
          context: context,
          builder: (BuildContext context) {
            return AlertDialog(
              content: unrelatedfunc(),
              actions: [
                TextButton(
                    child: const Text('Share'),
                    onPressed: () {
                      submit();
                      _TextFieldController.clear();
                      Navigator.of(context).pop();
                    })
              ],
            );
          });
    });
  }

Run Code Online (Sandbox Code Playgroud)

我不知道为什么,但我一直在调查,但我还没有看到这样的例子

Val*_*nal 11

如果您尝试显示一个包含Consumer(在内部使用ref)的对话框,请将您的Consumer内部构建器移至builder

showDialog就像Navigator.push,您应该只在 或 中调用它onPressedonTapinitState不是在build方法中调用它,因为您无法控制小部件将重建多少次。它不会构建一个小部件(像其他小部件一样),而是在历史记录中推送一个新的对话框页面(如Navigator.push)。

// Here you are in a `onPressed` of a button (for example):
showDialog(
  context: context,
  builder: (BuildContext context) {
    return Consumer(builder: (context, ref, _) {
      return AlertDialog(
        content: unrelatedfunc(),
        actions: [
          TextButton(
            child: const Text('Share'),
            onPressed: () {
             submit();
             _TextFieldController.clear();
             Navigator.of(context).pop();
            },
          ),
        ],
      );
    });
  },
);
Run Code Online (Sandbox Code Playgroud)

ref如果您需要在显示对话框的相同方法中使用(调用showDialog)(比方说按钮onPressed的 ),您可以使用以下内容包装按钮Consumer

Consumer(
  builder: (context, ref, _) {
    return TextButton(
      child: Text('My button'),
      onPressed: () {
        // You can use `ref` here.
        showDialog(
          context: context,
          builder: (context) {
            return AlertDialog(/* ... */);
          },
        );
      },
    );
  },
);
Run Code Online (Sandbox Code Playgroud)