feat(report): 实现AI学习报告计算页及相关组件

1. 新增报告计算进度圆环、科目卡片、完成弹窗组件
2. 重构report_computation_page,替换旧的自定义组件为新封装组件
3. 新增student_info_page的主题资源和UI重构,适配Flutter屏幕适配
4. 新增临时调试入口用于开发测试
This commit is contained in:
崔宝新
2026-09-10 11:57:18 +08:00
parent e0b95a8b43
commit 0fefc786bb
6 changed files with 1400 additions and 452 deletions
+44
View File
@@ -1,12 +1,16 @@
import 'package:flutter/material.dart';
import 'package:flutter_inappwebview/flutter_inappwebview.dart';
import 'package:flutter_riverpod/flutter_riverpod.dart';
import 'package:flutter_screenutil/flutter_screenutil.dart';
import 'package:go_router/go_router.dart';
// ignore: unused_import —— 调试结束切回 TabApp 时使用
import 'package:new_learn/core/app.dart';
import 'package:new_learn/core/network/dio_client.dart';
import 'package:new_learn/core/providers/privacy_provider.dart';
import 'package:new_learn/core/router/app_router.dart';
import 'package:new_learn/core/storage/database/app_database.dart';
import 'package:new_learn/core/storage/privacy_storage.dart';
import 'package:new_learn/core/utils/screen_adapt_template.dart';
/// App 启动入口 —— 真正的业务代码都在 app.dart / pages/ 里
///
@@ -127,4 +131,44 @@ Future<void> main() async {
await AppDatabase.instance.init();
// ProviderScope:Riverpod 所有 provider 的容器,必须包在根
runApp(const ProviderScope(child: TabApp()));
// 临时调试用,跑完改回。
// 注意两点:
// 1. 页面组件用了 .w/.h/.spMin,必须包 ScreenUtilInit(与 TabApp 一致),
// 否则 ScreenUtil 的 late 字段未初始化会抛 LateInitializationError;
// 2. 必须用真实 appRouter(MaterialApp.router),不能用裸 MaterialApp(home:),
// 否则页面里 context.go('/') 找不到 GoRouter,点"立即开启学习蝶变"不会跳首页。
// runApp(const ProviderScope(child: _DebugApp()));
}
/// 临时调试壳:ScreenUtilInit + 真实路由表,启动后直接进 /reportComputation
class _DebugApp extends StatefulWidget {
const _DebugApp();
@override
State<_DebugApp> createState() => _DebugAppState();
}
class _DebugAppState extends State<_DebugApp> {
@override
void initState() {
super.initState();
// 首帧后跳到调试页(默认初始位置是 '/',直接进会先闪一帧首页)
WidgetsBinding.instance.addPostFrameCallback((_) {
appRouter.go('/reportComputation');
});
}
@override
Widget build(BuildContext context) {
return ScreenUtilInit(
designSize: AppAdapt.designSizeOf(context),
minTextAdapt: true,
splitScreenMode: true,
fontSizeResolver: AppAdapt.fontSizeResolver,
builder: (context, _) => MaterialApp.router(
debugShowCheckedModeBanner: false,
routerConfig: appRouter,
),
);
}
}