chore: 初始化脚手架 — sunny_mochi 企业级 Flutter 模板

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
This commit is contained in:
SkyJourney
2026-05-14 12:51:05 +08:00
commit 61017f1c39
204 changed files with 15386 additions and 0 deletions
+42
View File
@@ -0,0 +1,42 @@
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;
}