Template
Core 基础设施:Flavor 三包体系、Drift+SQLCipher 加密数据库 7 拦截器 Dio 网络栈、CrashReporter 崩溃日志、Sealed Failure 错误体系 5 色板主题系统、Auth 认证骨架(Clean Architecture)、Dev Panel、Mock Adapter 通过验证:flutter analyze(0 errors)、flutter test(全绿)、staging APK 74.8MB
43 lines
1.2 KiB
Dart
43 lines
1.2 KiB
Dart
import 'dart:async';
|
||
|
||
import 'package:flutter/material.dart';
|
||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||
import 'package:sunny_mochi/core/crash/crash_dialog.dart';
|
||
import 'package:sunny_mochi/core/crash/crash_reporter.dart';
|
||
|
||
/// 应用根部崩溃检测门(wraps AppRoot)。
|
||
///
|
||
/// 在第一帧渲染完成后检查 [pendingCrashProvider],若非 null 则强制弹出
|
||
/// [CrashDialog](barrierDismissible: false)。
|
||
class CrashGate extends ConsumerStatefulWidget {
|
||
const CrashGate({super.key, required this.child});
|
||
final Widget child;
|
||
|
||
@override
|
||
ConsumerState<CrashGate> createState() => _CrashGateState();
|
||
}
|
||
|
||
class _CrashGateState extends ConsumerState<CrashGate> {
|
||
@override
|
||
void initState() {
|
||
super.initState();
|
||
final report = ref.read(pendingCrashProvider);
|
||
if (report != null) {
|
||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||
if (mounted) {
|
||
unawaited(
|
||
showDialog<void>(
|
||
context: context,
|
||
barrierDismissible: false,
|
||
builder: (_) => CrashDialog(report: report),
|
||
),
|
||
);
|
||
}
|
||
});
|
||
}
|
||
}
|
||
|
||
@override
|
||
Widget build(BuildContext context) => widget.child;
|
||
}
|