问题描述
我正在尝试实现Navigator 2.0方法。我唯一无法工作的是按下后退按钮。当我按下“后退”按钮时,该应用程序仅退出而不进入上一页。我尝试了WillPopPage小部件,但后退按钮绕过了它。
这是示例代码,不适用于反压。
import 'package:Flutter/material.dart';
main(List<String> args) {
runApp(TestApp());
}
class TestApp extends StatefulWidget {
@override
_TestAppState createState() => _TestAppState();
}
class _TestAppState extends State<TestApp> {
bool go = false;
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Navigator(
pages: [
// page 1
MaterialPage(
child: W1(onTapped: () {
setState(() => go = true);
}),),// page 2
if (go) MaterialPage(child: W2()),],onPopPage: (route,result) {
if (!route.didPop(result)) return false;
go = false;
return true;
},);
}
}
class W1 extends StatelessWidget {
final void Function() onTapped;
const W1({Key key,this.onTapped}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: FlatButton(
onpressed: onTapped,child: Text("Go to second"),);
}
}
class W2 extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
body: Center(
child: Text("pressing the back button is exiting the app.."),);
}
}
我已经用这种方法编写了很多代码,所以我不能再回到命令式导航了。如何用这种方法处理后台问题?
解决方法
如果不扩展 RouterDelegate
,这对于 Navigator 2.0 是不可能的。系统后退按钮按下由 RouteDelegate
的 popRoute
方法处理。根据文档:
该方法应返回一个布尔值 Future 以指示此委托是否处理请求。返回 false 将导致整个应用程序弹出。
默认实现总是返回 false。因此,您必须覆盖它以处理系统后退按钮按下。
更新
我发表了一篇文章,介绍了使用 Navigator 2.0 的快速且易于理解的指南。你可以找到它 here。
您必须使用'WillPopScope'https://api.flutter.dev/flutter/widgets/WillPopScope-class.html
示例
Future<bool> _willPopScopeCall() async {
// code to show toast or modal
return true; // return true to exit app or return false to cancel exit
}
//wrap your scaffold with WillPopScope
WillPopScope(child: new Scaffold(),onWillPop: _willPopScopeCall);