无法从 Navigator.of(context).pop("value") 捕获值 return

Can't capture values return from Navigator.of(context).pop("value")

我按以下方式导航到新屏幕

final result = await Navigator.of(context, rootNavigator: true).push(
      MaterialPageRoute(
        builder: (BuildContext context) => PreLog(             
        ),
      ),
    );

    if (result != null) {
      print("Back");
    }

PreLog 内部按照以下方式进入其他几个屏幕;

 Navigator.of(context, rootNavigator: true).pushReplacement(
        MaterialPageRoute(
          builder: (BuildContext context) => MyMap(
          ),
        ),
      );

在最后一屏我按照以下方式返回;

Navigator.of(context).pop("value");

我希望该值 return 显示到第一个屏幕。但它没有。 如何从最后一个屏幕返回值?


我已根据以下回复修改了我的问题。

在主屏幕中,我正在推送 PopTest 小部件

final result = await Navigator.of(context).push(
      MaterialPageRoute(
        builder: (BuildContext context) => PopTest(),
      ),
    );

    print(result);

我正在从 PopTest 加载另一个替换小部件“PopTest2”

class PopTest extends StatefulWidget {
  @override
  _PopTestState createState() => _PopTestState();
}

class _PopTestState extends State<PopTest> {
  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.start,
      crossAxisAlignment: CrossAxisAlignment.stretch,
      children: [
        RaisedButton(
          child: Text("Exit"),
          onPressed: () {
            Navigator.of(context).pop("value from 1");
          },
        ),
        RaisedButton(
          child: Text("Load Next"),
          onPressed: () async {
            final result2 = await Navigator.of(context).pushReplacement(
              MaterialPageRoute(
                builder: (BuildContext context) => PopTest2(),
              ),
            );
          },
        ),
      ],
    );
  }
}

class PopTest2 extends StatefulWidget {
  @override
  _PopTestState2 createState() => _PopTestState2();
}

class _PopTestState2 extends State<PopTest2> {
  @override
  Widget build(BuildContext context) {
    return Column(
      mainAxisAlignment: MainAxisAlignment.start,
      crossAxisAlignment: CrossAxisAlignment.stretch,
      children: [
        RaisedButton(
          child: Text("Exit"),
          onPressed: () {
            Navigator.of(context).pop("value from 2");
          },
        ),
      ],
    );
  }
}

如果我退出 PopTest,我会得到一个 return 值。

但是如果我退出 PopTest2,我不会得到 return 值。

任何人都可以提供一些帮助吗?

您正在将 rootNavigator 设置为 true,这会将您推送的 widget/screen 放置到您的应用程序的根目录,它后面没有 widgets/screens。

在您的代码中省略 rootNavigator:true(默认情况下为 false)

final result = await Navigator.of(context).push(
      MaterialPageRoute(
        builder: (BuildContext context) => PreLog(             
        ),
      ),
    );

Prelog 页面(下)

// result2 is a variable with scope accessible to Navigator.pop()

result2 = await Navigator.of(context).pushReplacement(
        MaterialPageRoute(
          builder: (BuildContext context) => MyMap(
          ),
        ),
      );

//when you are returning back 
Navigator.of(context).pop(result2);


编辑答案::(编辑问题后)

之前,我没有注意到您正在推动页面替换。

查看这些图片以更好地理解:: Main Screen of App,Screen One,Screen Two

在导航堆栈中,我们有主屏幕(等待 PopTest1 屏幕的结果)和 PopTest1 屏幕。

当您推送 PopTest2 小部件作为替换屏幕时,您的导航堆栈现在有主屏幕(从 PopTest1 屏幕 获得结果)和 PopTest2 屏幕。阅读 pushRelpacement api docs.

PopTest1 现在被堆栈中的 PopTest2 取代。此外,PopTest1 的“OnPressed 函数”正在等待结果。

这就是您无法在主屏幕上获得价值的原因。

你可以通过

解决这个问题
  1. 在 PopTest1 Widget 的 pushReplacement 调用中传递 value 可选参数。查看 flutter docs.
  2. 使用命名路由。查看 Reso Coder's blog .