main.dart 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. import 'dart:async';
  2. import 'package:flutter/foundation.dart';
  3. import 'package:flutter/material.dart';
  4. import 'package:flutter/services.dart';
  5. import 'package:flutter_localizations/flutter_localizations.dart';
  6. import 'package:flutter_smart_dialog/flutter_smart_dialog.dart';
  7. import 'package:logger/logger.dart';
  8. import 'package:lszlgl/config/colors.dart';
  9. import 'package:lszlgl/router/my_navigator.dart';
  10. late Logger logger;
  11. void main() async {
  12. logger = Logger(printer: PrettyPrinter(methodCount: 0));
  13. initReportException(() async {
  14. SystemChrome.setSystemUIOverlayStyle(SystemUiOverlayStyle.light.copyWith(statusBarColor: Colors.transparent));
  15. SystemChrome.setPreferredOrientations([
  16. DeviceOrientation.portraitUp,
  17. DeviceOrientation.portraitDown,
  18. ]);
  19. runApp(const MyApp());
  20. });
  21. }
  22. /// 初始化异常上报 封装[runZonedGuarded]
  23. void initReportException(Function() callback) {
  24. runZonedGuarded(() {
  25. // 初始化Flutter
  26. WidgetsFlutterBinding.ensureInitialized();
  27. // 隔离线程异常
  28. // Isolate.current.addErrorListener(RawReceivePort((dynamic pair) {
  29. // var isolateError = pair as List<dynamic>;
  30. // onError(isolateError.first, isolateError.last);
  31. // }).sendPort);
  32. // 捕获Flutter异常
  33. FlutterError.onError = (FlutterErrorDetails error) {
  34. FlutterError.presentError(error);
  35. onError(error.exception, error.stack);
  36. };
  37. // 回调外部方法
  38. callback.call();
  39. }, (error, stack) {
  40. // 捕获程序异常
  41. onError(error, stack);
  42. });
  43. }
  44. /// 上报异常
  45. Future<void> onError(Object exception, StackTrace? stack) async {
  46. if (stack == null) return;
  47. logger.e('error:${exception.runtimeType.toString()}\n${exception.toString()}\n${stack.toString()}');
  48. }
  49. class MyApp extends StatelessWidget {
  50. const MyApp({super.key});
  51. @override
  52. Widget build(BuildContext context) {
  53. return MaterialApp(
  54. title: '粮食质量管理${kReleaseMode ? '' : '-测试'}',
  55. theme: ThemeData(
  56. colorScheme: ColorScheme.fromSeed(
  57. seedColor: Colors.blue,
  58. ),
  59. scaffoldBackgroundColor: MyColor.c_background,
  60. // navigationBarTheme: const NavigationBarThemeData(height: 56),
  61. appBarTheme: const AppBarTheme(
  62. centerTitle: true,
  63. foregroundColor: Colors.white,
  64. backgroundColor: Colors.transparent,
  65. systemOverlayStyle: SystemUiOverlayStyle.light,
  66. ),
  67. bottomSheetTheme: const BottomSheetThemeData(
  68. backgroundColor: Colors.white,
  69. modalBackgroundColor: Colors.white,
  70. surfaceTintColor: Colors.white,
  71. ),
  72. useMaterial3: true,
  73. ),
  74. builder: FlutterSmartDialog.init(),
  75. localizationsDelegates: const [
  76. GlobalMaterialLocalizations.delegate,
  77. GlobalCupertinoLocalizations.delegate,
  78. GlobalWidgetsLocalizations.delegate,
  79. ],
  80. supportedLocales: const [Locale('zh')],
  81. navigatorKey: MyNavigator.navigator,
  82. onGenerateRoute: MyNavigator.generateRoute,
  83. navigatorObservers: [
  84. MyNavigator.navigatorObs,
  85. MyNavigator.routeObs,
  86. FlutterSmartDialog.observer,
  87. ],
  88. );
  89. }
  90. }
  91. class MyHomePage extends StatefulWidget {
  92. const MyHomePage({super.key, required this.title});
  93. final String title;
  94. @override
  95. State<MyHomePage> createState() => _MyHomePageState();
  96. }
  97. class _MyHomePageState extends State<MyHomePage> {
  98. int _counter = 0;
  99. void _incrementCounter() {
  100. setState(() {
  101. _counter++;
  102. });
  103. }
  104. @override
  105. Widget build(BuildContext context) {
  106. return Scaffold(
  107. appBar: AppBar(
  108. backgroundColor: Theme.of(context).colorScheme.inversePrimary,
  109. title: Text(widget.title),
  110. ),
  111. body: Center(
  112. child: Column(
  113. mainAxisAlignment: MainAxisAlignment.center,
  114. children: <Widget>[
  115. const Text(
  116. 'You have pushed the button this many times:',
  117. ),
  118. Text(
  119. '$_counter',
  120. style: Theme.of(context).textTheme.headlineMedium,
  121. ),
  122. ],
  123. ),
  124. ),
  125. floatingActionButton: FloatingActionButton(
  126. onPressed: _incrementCounter,
  127. tooltip: 'Increment',
  128. child: const Icon(Icons.add),
  129. ),
  130. );
  131. }
  132. }