我觉得官方代码关于navigator2.0的写法才是最佳实践,参考https://flutter.cn/community/tutorials/understanding-navigator-v2,
即:
//所有的页面
final pages = <MaterialPage>[];
//添加删除页面的接口
void push(Widget page) {
pages.add(page);
notifyListeners();
}
void pop() {
if (pages.isNotEmpty) {
pages.remove(pages.last);
}
notifyListeners();
}
///供onPopPage调用
bool _onPopPage(Route<dynamic> route, dynamic result) {
if (_stack.isNotEmpty) {
if (pages.last == route.settings.name) {
pages.remove(route.settings.name);
notifyListeners();
}
}
return route.didPop(result);
}
重点部分:
return Navigator(
...
///当app bar里的backButtion被定义,触发调用onPopPage
onPopPage: _onPopPage,
)
///当点击android 物理返回按钮时(下面的那个),注意和app bar的返回按钮作区分
Future<bool> popRoute() async {
LogUtil.e('拦截物理返回按钮');
/*
此处自定义返回行为,假如你的路由是由bloc中的state决定的,那么此处应该改状态
*/
/// 默认行为,点击两次退出app
///如果return true,会卡在最近的router里
///如果reutnr false,则交给父router,所谓父router,是嵌套路由里的概念。
return navigatorKey.currentState!.maybePop();
}
一次性掌握Flutter高阶技能+商业级复杂项目架构设计与开发方案
了解课程