网站建设制作pdf,网站用户体验解决方案,做搜狗网站点击赚钱,网络传媒公司名字接着完善上一篇内容#xff0c;上一篇我们是能监听到初次进入路由页面节点#xff0c;往往还想监听从当前路由跳转到其他路由后#xff0c;再返回到当前路由页面#xff0c;上一篇内容就无法满足当前需求了#xff0c;不过我们完全可以按照上一篇的原理实现这个需求。
直…接着完善上一篇内容上一篇我们是能监听到初次进入路由页面节点往往还想监听从当前路由跳转到其他路由后再返回到当前路由页面上一篇内容就无法满足当前需求了不过我们完全可以按照上一篇的原理实现这个需求。
直接上代码
/// author bawomingtian
/// date 2023/10/16
/// desc 通过监听路由入场动画完成判断路由完全进入可以用来优化在进场动画执行过程中
/// 异步请求数据刷新界面导致进场动画卡顿的问题
class AsyncStateT extends StatefulWidget extends StateT with RouteAwareMixin implements NavigatorObserver {Completerbool _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();}FutureE asyncWaitResumeE(FutureE 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 为第一次进入路由页面回调
方法 resumeAsyncLoad 为从其他路由返回到该路由页面回调 有了这两个方法我们就可以异步请求一些耗时或者频繁多次调用的接口了不用担心影响路由跳转动画