假设现在在页面A中push出页面B,然后在A中要知道页面B被pop了,最重要的是要得到页面B中的数据.
在flutter中,通过导航器弹出一个新页面的写法是,在A中:

1
Navigator.of(context).push(new MaterialPageRoute(builder: (BuildContext context) => B()));

然后要弹出B页面的写法,一般情况下这个语句是写在B页面中的.

1
Navigator.of(context).pop();

点开pop方法查看,你会发现他能接受一个泛型参数,就是说只要里面是个对象就行.这样就简单了,我们可以传任意东西回去,然后在A中判断传回来的东西就行,现在的问题就是在A中怎么接收通过B中pop回来的参数.
我们再回过头来仔细看一下导航器的push方法的,他的定义如下:

1
2
3
Future\<T\> push\<T extends Object\>(Route\<T\> route){
....
}

你会发现他返回了一个Future的泛型,而我们在pop中传的参数也是泛型.你猜对了,这里就是接收pop传出来的参数的地方,因为Future是异步的,所以我们如下改写A的push方法,将他放在一个异步方法中即可实现接收B传回的值

1
2
3
Future \< String \> waitValueOfB() async {
return await Navigator.of(ctx).push(MaterialPageRoute(builder: (BuildContext context) =\> B()));
}

使用时建议用then的方法来取值,这样就不必将调用这个方法所在的方法也声明为async

1
2
3
waitValueOfB().then((String ccc) {
print("ccc $ccc,phone ${widget.phoneNumber}");
});