在Flutter中,可以通过以下几种方式监听路由变化:
1. 使用 RouteObserver(推荐)
// 创建路由观察者
final RouteObserver<PageRoute> routeObserver = RouteObserver<PageRoute>();
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
navigatorObservers: [routeObserver],
home: HomePage(),
);
}
}
// 在需要监听的页面使用
class HomePage extends StatefulWidget {
@override
_HomePageState createState() => _HomePageState();
}
class _HomePageState extends State<HomePage> with RouteAware {
@override
void didChangeDependencies() {
super.didChangeDependencies();
routeObserver.subscribe(this, ModalRoute.of(context)!);
}
@override
void dispose() {
routeObserver.unsubscribe(this);
super.dispose();
}
// 路由进入时调用
@override
void didPush() {
print('路由进入');
}
// 路由弹出时调用
@override
void didPopNext() {
print('路由返回');
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: Text('首页')),
body: Center(
child: ElevatedButton(
onPressed: () {
Navigator.push(context, MaterialPageRoute(builder: (_) => SecondPage()));
},
child: Text('跳转到第二页'),
),
),
);
}
}
2. 使用 Navigator 的回调
Navigator.push(
context,
MaterialPageRoute(builder: (context) => SecondPage()),
).then((value) {
print('路由返回,返回值: $value');
});
3. 使用 WidgetsBindingObserver
class MyWidget extends StatefulWidget {
@override
_MyWidgetState createState() => _MyWidgetState();
}
class _MyWidgetState extends State<MyWidget> with WidgetsBindingObserver {
@override
void initState() {
super.initState();
WidgetsBinding.instance.addObserver(this);
}
@override
void dispose() {
WidgetsBinding.instance.removeObserver(this);
super.dispose();
}
@override
void didPopRoute() {
print('系统返回按钮被点击');
}
@override
Widget build(BuildContext context) {
return Container();
}
}
推荐使用 RouteObserver,它提供了最细粒度的路由变化监听,可以准确知道页面的进入和离开状态。