Files
2026-03-22 15:24:40 +08:00

183 lines
5.0 KiB
Dart

/// 自然写互动课堂平板端应用软件 V1.0
/// APP入口 - Flutter平板端应用初始化
///
/// 功能说明:
/// 1. 平板端应用初始化(Pad自适应布局配置)
/// 2. 学生端/教师端双模式切换
/// 3. 护眼模式初始化(色温调节、使用时长监控)
/// 4. 全局Bloc状态管理注入
/// 5. 离线模式支持(断网时可继续作答)
import 'dart:async';
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
/// 应用入口
void main() async {
WidgetsFlutterBinding.ensureInitialized();
// 全局错误处理
FlutterError.onError = (FlutterErrorDetails details) {
FlutterError.presentError(details);
debugPrint('[CrashReport] ${details.exception}');
};
// 设置系统UI(平板端支持横屏+竖屏)
await SystemChrome.setPreferredOrientations([
DeviceOrientation.portraitUp,
DeviceOrientation.portraitDown,
DeviceOrientation.landscapeLeft,
DeviceOrientation.landscapeRight,
]);
// 初始化全局服务
await _initServices();
runZonedGuarded(() {
runApp(const WritechPadApp());
}, (error, stack) {
debugPrint('[CrashReport] $error\n$stack');
});
}
/// 初始化全局服务
Future<void> _initServices() async {
debugPrint('[App] 服务初始化开始');
// 初始化数据库、网络、BLE、护眼模块
debugPrint('[App] 服务初始化完成');
}
/// 平板端应用根Widget
class WritechPadApp extends StatefulWidget {
const WritechPadApp({super.key});
@override
State<WritechPadApp> createState() => _WritechPadAppState();
}
class _WritechPadAppState extends State<WritechPadApp>
with WidgetsBindingObserver {
/// 当前用户模式(学生/教师)
String _userMode = 'student';
/// 护眼模式是否开启
bool _eyeCareEnabled = false;
/// 色温滤镜值(0.0=正常,1.0=最暖)
double _colorTemperature = 0.0;
@override
void initState() {
super.initState();
WidgetsBinding.instance.addObserver(this);
}
@override
void dispose() {
WidgetsBinding.instance.removeObserver(this);
super.dispose();
}
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
if (state == AppLifecycleState.resumed) {
debugPrint('[App] 应用恢复前台');
} else if (state == AppLifecycleState.paused) {
debugPrint('[App] 应用进入后台');
}
}
@override
Widget build(BuildContext context) {
return MaterialApp(
title: '自然写互动课堂',
debugShowCheckedModeBanner: false,
theme: ThemeData(
useMaterial3: true,
colorScheme: ColorScheme.fromSeed(
seedColor: const Color(0xFF4CAF50),
brightness: Brightness.light,
),
fontFamily: 'NotoSansSC',
),
// 护眼色温滤镜叠加
builder: (context, child) {
if (_eyeCareEnabled && _colorTemperature > 0) {
return ColorFiltered(
colorFilter: ColorFilter.matrix(_buildWarmMatrix(_colorTemperature)),
child: child,
);
}
return child ?? const SizedBox();
},
initialRoute: '/splash',
routes: {
'/splash': (_) => const _SplashPage(),
'/login': (_) => const _LoginPage(),
'/student_home': (_) => const _StudentHomePage(),
'/teacher_home': (_) => const _TeacherHomePage(),
'/homework': (_) => const _HomeworkPage(),
'/practice': (_) => const _PracticePage(),
'/error_book': (_) => const _ErrorBookPage(),
'/settings': (_) => const _SettingsPage(),
},
);
}
/// 构建暖色温矩阵(护眼模式)
List<double> _buildWarmMatrix(double intensity) {
final r = 1.0;
final g = 1.0 - intensity * 0.1;
final b = 1.0 - intensity * 0.3;
return [
r, 0, 0, 0, 0,
0, g, 0, 0, 0,
0, 0, b, 0, 0,
0, 0, 0, 1, 0,
];
}
}
// 占位页面声明
class _SplashPage extends StatelessWidget {
const _SplashPage();
@override
Widget build(BuildContext context) => const Scaffold(body: Center(child: Text('自然写')));
}
class _LoginPage extends StatelessWidget {
const _LoginPage();
@override
Widget build(BuildContext context) => const Scaffold();
}
class _StudentHomePage extends StatelessWidget {
const _StudentHomePage();
@override
Widget build(BuildContext context) => const Scaffold();
}
class _TeacherHomePage extends StatelessWidget {
const _TeacherHomePage();
@override
Widget build(BuildContext context) => const Scaffold();
}
class _HomeworkPage extends StatelessWidget {
const _HomeworkPage();
@override
Widget build(BuildContext context) => const Scaffold();
}
class _PracticePage extends StatelessWidget {
const _PracticePage();
@override
Widget build(BuildContext context) => const Scaffold();
}
class _ErrorBookPage extends StatelessWidget {
const _ErrorBookPage();
@override
Widget build(BuildContext context) => const Scaffold();
}
class _SettingsPage extends StatelessWidget {
const _SettingsPage();
@override
Widget build(BuildContext context) => const Scaffold();
}