QinGang_interested/lib/common/route_aware_state.dart

61 lines
1.5 KiB
Dart
Raw Normal View History

2025-12-12 09:11:30 +08:00
// 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<MyPage> { ... }
abstract class RouteAwareState<T extends StatefulWidget> extends State<T> with RouteAware {
/// 当页面真正可见(首次 push 或从上层 pop 返回)时会调用
@protected
FutureOr<void> 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 (_) {}
});
}
}