WillPopScope的回调没有在我预期的时候被触发。我如何WillPopScope在 a 内部使用,Navigator以便路线可以处理它自己的后压行为。
我正在学习使用颤振,并且遇到过Navigator创建多个页面(我知道还有其他导航小部件,但我正在追求仅支持编程导航的东西,因此我可以处理所有 UI)。
我想看的下一件事Navigator是返回,我发现WillPopScope它包装了一个组件并有一个回调,当按下返回按钮时(如果组件被渲染)。这对我来说似乎很理想,因为我只希望在呈现 Widget 时调用回调。
我尝试WillPopScope在 a 内使用,目的是仅在按下后退按钮时调用Navigator它的回调( ),但在 a内什么都不做(不调用回调)。onWillPopWillPopScopeNavigator
目的是Navigator导航到顶级路线,并且这些路线本身可能具有Navigators,因此放入WillPopScope内部意味着每条路线(或子路线)都负责它自己的后退导航。
我查过的许多问题似乎都集中在MaterialApp、Scaffold或其他处理导航的方式上;我正在寻找如何在没有这些东西带来的 UI 的情况下处理这个问题(一个用例可能是一个测验应用程序,您需要单击下一步按钮才能继续前进,或类似的东西)。
这是我希望路由 2 处理它自己的后退导航的最小main.dart文件(为了简单起见,我没有在此示例中放置嵌套路由)。
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: 'Flutter Navigation',
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
MyHomePage({Key key}) : super(key: key);
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
@override
Widget build(BuildContext parentContext) {
return Container(
color: Theme.of(context).colorScheme.primary,
child: Navigator(
initialRoute: "1",
onGenerateRoute: (settings) {
return PageRouteBuilder(pageBuilder: (BuildContext context,
Animation animation, Animation secondaryAnimation) {
switch (settings.name) {
case "1":
return Container(
color: Colors.red,
child: GestureDetector(onTap: () {
debugPrint("going from 1 to 2");
Navigator.of(context).pushNamed("2");
}));
case "2":
return WillPopScope(
child: Container(color: Colors.green),
onWillPop: ()async {
debugPrint("popping from route 2 disabled");
return false;
},
);
default:
throw Exception("unrecognised route \"${settings.name}\"");
}
});
})
);
}
}
在路线 1 或 2 中按下后退按钮时,应用程序将退出。我希望仅在路线 1 中出现这种情况,而路线 2 应该只记录popping from route 2 disabled(没有导航离开页面或离开应用程序)。
据我了解,Navigator并且WillPopScope是用于此类事情的小部件,但如果不是,那么我将如何实现自包含(可能嵌套)的路由。