和安卓原生一樣,Flutter 也可以返回數據到上一個頁面。安卓原生是通過不同的活動啓動方式來實現數據的返回,需要藉助回調函數,Flutter 是通過同步異步的方式實現的。
返回數據的方法是通過異步方法(async)打開頁面,然後同步(await)等待返回結果。
_navigaterToSecondPage(BuildContext context) async{
//等待第二個頁面返回結果
final result = await Navigator.push(
context,
new MaterialPageRoute(builder: (context) => new SecondPage()),
);
//底部顯示返回信息
Scaffold.of(context).showSnackBar(new SnackBar(content: new Text("$result")));
}
返回數據。
Navigator.pop(context,'data2');
下面將實現一個例子,在首頁定義一個按鈕進入第二個頁面,在第二個頁面有兩個按鈕供用戶選擇,不同按鈕返回不同值,並在第一個頁面通過 snackbar 顯示返回數據。
1 .定義主頁。
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('導航返回數據demo'),
),
body: Center(
child: FirstPage(),
),
);
}
}
2 .添加一個按鈕,打開第二個頁面,等待返回值。
class FirstPage extends StatelessWidget {
_navigaterToSecondPage(BuildContext context) async{
//等待第二個頁面返回結果
final result = await Navigator.push(
context,
new MaterialPageRoute(builder: (context) => new SecondPage()),
);
//底部顯示返回信息
Scaffold.of(context).showSnackBar(new SnackBar(content: new Text("$result")));
}
@override
Widget build(BuildContext context) {
return new RaisedButton(
onPressed: () {
_navigaterToSecondPage(context);
},
child: Text('進入第二頁'),
);
}
}
3 .第二個頁面顯示兩個按鈕,對應返回不同值。
class SecondPage extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('第二個頁面'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
new Padding(
padding: EdgeInsets.all(20.0),
child: RaisedButton(
onPressed: () {
Navigator.pop(context,'data1');
},
child: Text('返回數據1'),
),
),
new Padding(
padding: EdgeInsets.all(20.0),
child: RaisedButton(
onPressed: () {
Navigator.pop(context,'data2');
},
child: Text('返回數據2'),
),
),
],
),
),
);
}
}
效果如下: