转自https://blog.youkuaiyun.com/sinat_17775997/article/details/106570011
| 实现 | 支持手势返回 | 回传参数 |
|---|---|---|
| 路由回调 | √ | √ |
| RouteAware | √ | × |
| deactivate | × | × |
实现一:路由回调
Navigator.push(context, route).then((res) {
// do some something
// res为pop方法回传参数
});
实现二:RouteAware
- 在程序入口定义静态变量
// 用于路由返回监听 static final RouteObserver<PageRoute> routeObserver = RouteObserver<PageRoute>(); - MaterialApp添加参数
return MaterialApp( // ... navigatorObservers: [MyApp.routeObserver] ); - 在需要定义的StatefulWidget的State中添加with RouteAware
class _MyPageStateState extends State<MyPage> with RouteAware{} - 添加订阅
@override void didChangeDependencies() { super.didChangeDependencies(); // 添加监听订阅 MyApp.routeObserver.subscribe(this, ModalRoute.of(context)); } @override void dispose() { // 移除监听订阅 MyApp.routeObserver.unsubscribe(this); super.dispose(); } - 重写监听方法
@override void didPush() { super.didPush(); // push进入当前页面时走这里 LogUtils.d('生命周期监听', 'didPush'); } @override void didPushNext() { super.didPushNext(); // 当前页面push到其他页面走这里 LogUtils.d('生命周期监听', 'didPushNext'); } @override void didPop() { super.didPop(); // pop出当前页面时走这里 LogUtils.d('生命周期监听', 'didPop'); } @override void didPopNext() { super.didPopNext(); // 从其他页面pop回当前页面走这里 LogUtils.d('生命周期监听', 'didPopNext'); }
实现三:重写State的deactivate方法
@override
void deactivate() {
bool isBack = ModalRoute.of(context).isCurrent;
if (isBack) {
// 限于从其他页面返回到当前页面时执行,首次进入当前页面不执行
// 注:此方法在iOS手势返回时,不执行此处
logPrint('从其他页面返回到${widget.runtimeType}页');
} else {
// 离开当前页面或退出当前页面时执行
logPrint('离开或退出${widget.runtimeType}页');
}
super.deactivate();
}
本文详细介绍了如何在Flutter应用中实现手势返回功能,包括使用路由回调、RouteAware监听以及重写State的deactivate方法。通过实例演示,展示了如何在不同场景下捕捉导航事件,提升用户体验。
8595

被折叠的 条评论
为什么被折叠?



