【问题标题】:Riverpod / Flutter Use showDialog inside Consumer ClassRiverpod / Flutter 在 Consumer 类中使用 showDialog
【发布时间】:2022-07-17 15:48:35
【问题描述】:

我不确定我缺少什么我有一个带有返回对话框的消费者类的简单方法,但问题如下

按照闭包上下文的要求,返回类型“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();
                    })
              ],
            );
          });
    });
  }

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

【问题讨论】:

    标签: flutter dart riverpod


    【解决方案1】:

    如果您尝试显示一个包含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();
                },
              ),
            ],
          );
        });
      },
    );
    

    如果您需要在显示对话框的相同方法中使用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(/* ... */);
              },
            );
          },
        );
      },
    );
    

    【讨论】:

    • 哇,谢谢,这是一个巨大的进步
    • 不客气,如果它回答了你的问题,别忘了验证回复以帮助未来的读者
    【解决方案2】:

    当您尝试转到包含 showDialog 而不是 Navigator.of(....).push... 的屏幕时,请使用 NavigatorState().push...

    【讨论】:

      猜你喜欢
      • 2021-05-03
      • 2021-03-17
      • 2021-01-22
      • 2021-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多