參考文章:
Flutter監(jiān)聽(tīng)路由返回
方法一:
push方法.then,支持手勢(shì)返回?,可以獲取傳回參數(shù)?。
方法二:
didPopNext,支持手勢(shì)返回?,但回傳參數(shù)獲取不到?。
方法三、
deactivate(),不支持手勢(shì)返回?,回傳參數(shù)獲取不到?。
各個(gè)使用方法:
方法一、push后.then即可
方法二、添加route監(jiān)聽(tīng)
1、程序入口添加:
// 用于路由返回監(jiān)聽(tīng)
static final RouteObserver<PageRoute> routeObserver = RouteObserver<PageRoute>();
2、MaterialApp下添加
return MaterialApp(
navigatorObservers: [MyApp.routeObserver],
3、所在頁(yè)面添加with RouteAware
4、添加訂閱和移除訂閱
@override
void didChangeDependencies() {
super.didChangeDependencies();
// 添加監(jiān)聽(tīng)訂閱
MyApp.routeObserver.subscribe(this, ModalRoute.of(context));
}
@override
void dispose() {
// 移除監(jiān)聽(tīng)訂閱
MyApp.routeObserver.unsubscribe(this);
super.dispose();
}
4、使用一下方法來(lái)監(jiān)聽(tīng)
@override
void didPush() {
super.didPush();
// push進(jìn)入當(dāng)前頁(yè)面時(shí)走這里
LogUtils.d('生命周期監(jiān)聽(tīng)', 'didPush');
}
@override
void didPushNext() {
super.didPushNext();
// 當(dāng)前頁(yè)面push到其他頁(yè)面走這里
LogUtils.d('生命周期監(jiān)聽(tīng)', 'didPushNext');
}
@override
void didPop() {
super.didPop();
// pop出當(dāng)前頁(yè)面時(shí)走這里
LogUtils.d('生命周期監(jiān)聽(tīng)', 'didPop');
}
@override
void didPopNext() {
super.didPopNext();
// 從其他頁(yè)面pop回當(dāng)前頁(yè)面走這里
LogUtils.d('生命周期監(jiān)聽(tīng)', 'didPopNext');
}
方法三、
@override
void deactivate() {
bool isBack = ModalRoute.of(context).isCurrent;
if (isBack) {
// 限于從其他頁(yè)面返回到當(dāng)前頁(yè)面時(shí)執(zhí)行,首次進(jìn)入當(dāng)前頁(yè)面不執(zhí)行
// 注:此方法在iOS手勢(shì)返回時(shí),不執(zhí)行此處
logPrint('從其他頁(yè)面返回到${widget.runtimeType}頁(yè)');
} else {
// 離開(kāi)當(dāng)前頁(yè)面或退出當(dāng)前頁(yè)面時(shí)執(zhí)行
logPrint('離開(kāi)或退出${widget.runtimeType}頁(yè)');
}
super.deactivate();
}