路由管理组件
路由管理组件用于处理应用内的页面导航和路由控制。
提示:良好的路由管理可以提升用户体验和应用的可维护性。
路由结构图
HomePage
/
DetailsPage
/details
NotFoundPage
/*
onGenerateRoute
onGenerateRoute 用于动态生成路由。
MaterialApp(
onGenerateRoute: (settings) {
switch (settings.name) {
case '/':
return MaterialPageRoute(
builder: (_) => HomePage(),
);
case '/details':
final args = settings.arguments as Map;
return MaterialPageRoute(
builder: (_) => DetailsPage(args: args),
);
default:
return MaterialPageRoute(
builder: (_) => NotFoundPage(),
);
}
},
)
onUnknownRoute
onUnknownRoute 处理未知的路由。
MaterialApp(
onUnknownRoute: (settings) {
return MaterialPageRoute(
builder: (_) => NotFoundPage(),
);
},
)
initialRoute
initialRoute 指定应用的初始路由。
MaterialApp(
initialRoute: '/login',
routes: {
'/login': (context) => LoginPage(),
'/home': (context) => HomePage(),
},
)
初始路由配置
初始路由: /login
应用启动时直接显示登录页面
NavigatorObserver
NavigatorObserver 用于观察导航事件。
class MyNavigatorObserver extends NavigatorObserver {
@override
void didPush(Route route, Route? previousRoute) {
super.didPush(route, previousRoute);
print('推送路由: ${route.settings.name}');
}
@override
void didPop(Route route, Route? previousRoute) {
super.didPop(route, previousRoute);
print('弹出路由: ${route.settings.name}');
}
}
MaterialApp(
navigatorObservers: [MyNavigatorObserver()],
home: HomePage(),
)
导航事件日志
📱 App started
✅ didPush: /home
[route stack: /home]
✅ didPush: /details
[route stack: /home → /details]
❌ didPop: /details
[route stack: /home]
popUntil
popUntil 弹出路由直到满足条件。
// 返回到首页
Navigator.popUntil(context, ModalRoute.withName('/'));
// 返回两页
Navigator.popUntil(context, (route) {
return Navigator.of(context).canPop() &&
Navigator.of(context).userGestureInProgress;
});
// 使用命名路由
Navigator.popUntil(context, (route) {
return route.settings.name == '/home';
});
popUntil 路由栈变化
操作前:
/home
/details
/settings
Navigator.popUntil(context, ModalRoute.withName('/')):
/home
弹出所有页面直到首页
pushAndRemoveUntil
pushAndRemoveUntil 推送新路由并移除所有旧路由。
// 清空路由栈并推送新页面
Navigator.pushAndRemoveUntil(
context,
MaterialPageRoute(builder: (_) => HomePage()),
(route) => false,
);
// 保留底部导航
Navigator.pushAndRemoveUntil(
context,
MaterialPageRoute(builder: (_) => LoginPage()),
ModalRoute.withName('/'),
);
pushAndRemoveUntil 路由栈变化
操作前:
/login
/otp
/register
Navigator.pushAndRemoveUntil(..., (route) => false):
/home
清空所有旧路由,只保留新页面
pushReplacement
pushReplacement 替换当前路由。
// 替换当前页面
Navigator.pushReplacement(
context,
MaterialPageRoute(builder: (_) => HomePage()),
);
// 使用命名路由
Navigator.pushReplacementNamed(
context,
'/home',
);
pushReplacement 路由栈变化
操作前:
/login
/home
Navigator.pushReplacement(..., /profile):
/login
/profile
替换当前页面,用户无法返回
路由管理最佳实践:
- 使用命名路由提高代码可读性
- 使用 onGenerateRoute 处理复杂路由
- 使用 NavigatorObserver 监控导航
- 合理使用 popUntil 避免用户困惑
- 使用 Hero 动画提升用户体验
注意事项:
- Web 平台的路由行为可能与移动平台不同
- 深层嵌套的路由可能导致内存问题
- 使用 pushAndRemoveUntil 时要小心