在下面的示例应用中,我有两个路由: HomeRoute
和 OtherRoute
。我希望OtherRoute
从导航器弹出时始终返回结果。在此示例中,当按下OtherRoute
中的RaisedButton
时,可以执行此操作。但是,我还希望当按下后退按钮时返回结果。我知道我可以覆盖AppBar
上的后退按钮,但我也想覆盖Android上的"系统"后按钮的行为。
我知道我可以使用WillPopScope
来防止系统返回按钮弹出当前路线,但我不希望这样做。如果可能的话,我希望系统返回按钮仍然能够弹出当前路线,仅包括结果。这可能吗?
这是我的示例应用程序:
import 'package:flutter/material.dart';
void main() => runApp(MyApp());
class MyApp extends StatelessWidget {
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Test',
home: Scaffold(
appBar: AppBar(title: Text("Home"),),
body: HomeRoute(),
),
);
}
}
class HomeRoute extends StatelessWidget{
@override
Widget build(BuildContext context) {
return RaisedButton(onPressed: (){
Navigator.push(context, MaterialPageRoute(builder: (context){
return OtherRoute();
})).then((result){
// I want result here to never be null
Scaffold.of(context).showSnackBar(SnackBar(content: Text("$result")));
});
});
}
}
class OtherRoute extends StatelessWidget{
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text("Other route"),),
body: RaisedButton(onPressed: (){
Navigator.pop(context, "Result!");
})
);
}
}
用OtherRoute
中的WillPopScope
和覆盖onWillPop
方法包裹您的脚手架,如下所示:
@override
Widget build(BuildContext context) {
return WillPopScope(
//....
),
onWillPop: () async {
Navigator.pop(context, "Result!");
return false;
},
);
}