深圳網(wǎng)站營銷公司談?wù)勀銓ヂ?lián)網(wǎng)營銷的認(rèn)識
接著完善上一篇內(nèi)容,上一篇我們是能監(jiān)聽到初次進(jìn)入路由頁面節(jié)點(diǎn),往往還想監(jiān)聽從當(dāng)前路由跳轉(zhuǎn)到其他路由后,再返回到當(dāng)前路由頁面,上一篇內(nèi)容就無法滿足當(dāng)前需求了,不過我們完全可以按照上一篇的原理實(shí)現(xiàn)這個(gè)需求。
直接上代碼
/// @author bawomingtian
/// @date 2023/10/16
/// @desc 通過監(jiān)聽路由入場動(dòng)畫完成,判斷路由完全進(jìn)入,可以用來優(yōu)化在進(jìn)場動(dòng)畫執(zhí)行過程中
/// 異步請求數(shù)據(jù)刷新界面,導(dǎo)致進(jìn)場動(dòng)畫卡頓的問題
class AsyncState<T extends StatefulWidget> extends State<T> with RouteAwareMixin implements NavigatorObserver {Completer<bool> _resumeCompleter = Completer();@overridevoid didChangeDependencies() {ModalRoute.of(context)!.controller?.addStatusListener((status) {if (status == AnimationStatus.completed) {_resumeCompleter.complete(true);initAsyncLoad();}});super.didChangeDependencies();}@overridevoid initState() {super.initState();Navigator.observer.add(this);}@overridevoid dispose() {Navigator.observer.remove(this);super.dispose();}Future<E> asyncWaitResume<E>(Future<E> future) async {var value = await future;await _resumeCompleter.future;return value;}void initAsyncLoad() {}void resumeAsyncLoad() {}@overrideWidget build(BuildContext context) {return const SizedBox();}@overridevoid didPush(Route route, Route? previousRoute) {if (route is ModalRoute) {route.controller?.addStatusListener((status) {if (status == AnimationStatus.dismissed) {resumeAsyncLoad();}});}super.didPush(route, previousRoute);}}mixin RouteAwareMixin {void didPop(Route route, Route? previousRoute) {}void didPush(Route route, Route? previousRoute) {}void didRemove(Route route, Route? previousRoute) {}void didReplace({Route? newRoute, Route? oldRoute}) {}void didStartUserGesture(Route route, Route? previousRoute) {}void didStopUserGesture() {}@overrideNavigatorState? get navigator => throw UnimplementedError();
}
方法 initAsyncLoad 為第一次進(jìn)入路由頁面回調(diào)
方法?resumeAsyncLoad 為從其他路由返回到該路由頁面回調(diào)
有了這兩個(gè)方法,我們就可以異步請求一些耗時(shí)或者頻繁多次調(diào)用的接口了,不用擔(dān)心影響路由跳轉(zhuǎn)動(dòng)畫