// lib/common/route_aware_state.dart import 'dart:async'; import 'package:flutter/widgets.dart'; import 'package:qhd_prevention/common/route_observer.dart'; /// 可复用的 RouteAware State 基类 /// 使用方式:class _MyPageState extends RouteAwareState { ... } abstract class RouteAwareState extends State with RouteAware { /// 当页面真正可见(首次 push 或从上层 pop 返回)时会调用 @protected FutureOr onVisible(); @override void didChangeDependencies() { super.didChangeDependencies(); final ModalRoute? route = ModalRoute.of(context); if (route is PageRoute) { routeObserver.subscribe(this, route); } } @override void dispose() { try { routeObserver.unsubscribe(this); } catch (_) {} super.dispose(); } @override void didPush() { // 页面被 push 到栈顶(首次展示) _safeCallOnVisible(); } @override void didPopNext() { // 从上层 pop 回到当前页面(页面再次可见) _safeCallOnVisible(); } @override void didPushNext() { // 当前页面被新的页面覆盖(不可见) super.didPushNext(); } void _safeCallOnVisible() { // 延后到当前帧完成后执行,避免在 build 期间触发 setState 导致断言 WidgetsBinding.instance.addPostFrameCallback((_) { if (!mounted) return; try { final r = onVisible(); if (r is Future) { r.catchError((_) {}); } } catch (_) {} }); } }