app_widget.dart 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. import 'package:app_flowy/startup/startup.dart';
  2. import 'package:app_flowy/user/application/user_settings_service.dart';
  3. import 'package:app_flowy/workspace/application/appearance.dart';
  4. import 'package:easy_localization/easy_localization.dart';
  5. import 'package:flowy_infra/theme.dart';
  6. import 'package:flowy_infra_ui/flowy_infra_ui.dart';
  7. import 'package:flutter/material.dart';
  8. import 'package:provider/provider.dart';
  9. import 'package:window_size/window_size.dart';
  10. import 'package:bloc/bloc.dart';
  11. import 'package:flowy_sdk/log.dart';
  12. class InitAppWidgetTask extends LaunchTask {
  13. @override
  14. LaunchTaskType get type => LaunchTaskType.appLauncher;
  15. @override
  16. Future<void> initialize(LaunchContext context) async {
  17. final widget = context.getIt<EntryPoint>().create();
  18. final setting = await SettingsFFIService().getAppearanceSetting();
  19. final settingModel = AppearanceSetting(setting);
  20. final app = ApplicationWidget(
  21. settingModel: settingModel,
  22. child: widget,
  23. );
  24. Bloc.observer = ApplicationBlocObserver();
  25. runApp(
  26. EasyLocalization(
  27. supportedLocales: const [
  28. // In alphabetical order
  29. Locale('ca', 'ES'),
  30. Locale('de', 'DE'),
  31. Locale('en'),
  32. Locale('es', 'VE'),
  33. Locale('fr', 'FR'),
  34. Locale('fr', 'CA'),
  35. Locale('hu', 'HU'),
  36. Locale('id', 'ID'),
  37. Locale('it', 'IT'),
  38. Locale('ja', 'JP'),
  39. Locale('pl', 'PL'),
  40. Locale('pt', 'BR'),
  41. Locale('ru', 'RU'),
  42. Locale('tr', 'TR'),
  43. Locale('zh', 'CN'),
  44. ],
  45. path: 'assets/translations',
  46. fallbackLocale: const Locale('en'),
  47. useFallbackTranslations: true,
  48. saveLocale: false,
  49. child: app,
  50. ),
  51. );
  52. return Future(() => {});
  53. }
  54. }
  55. class ApplicationWidget extends StatelessWidget {
  56. final Widget child;
  57. final AppearanceSetting settingModel;
  58. const ApplicationWidget({
  59. Key? key,
  60. required this.child,
  61. required this.settingModel,
  62. }) : super(key: key);
  63. @override
  64. Widget build(BuildContext context) {
  65. return ChangeNotifierProvider.value(
  66. value: settingModel,
  67. builder: (context, _) {
  68. const ratio = 1.73;
  69. const minWidth = 600.0;
  70. setWindowMinSize(const Size(minWidth, minWidth / ratio));
  71. settingModel.readLocaleWhenAppLaunch(context);
  72. AppTheme theme = context.select<AppearanceSetting, AppTheme>(
  73. (value) => value.theme,
  74. );
  75. Locale locale = context.select<AppearanceSetting, Locale>(
  76. (value) => value.locale,
  77. );
  78. return MultiProvider(
  79. providers: [
  80. Provider.value(value: theme),
  81. Provider.value(value: locale),
  82. ],
  83. builder: (context, _) {
  84. return MaterialApp(
  85. builder: overlayManagerBuilder(),
  86. debugShowCheckedModeBanner: false,
  87. theme: theme.themeData,
  88. localizationsDelegates: context.localizationDelegates,
  89. supportedLocales: context.supportedLocales,
  90. locale: locale,
  91. navigatorKey: AppGlobals.rootNavKey,
  92. home: child,
  93. );
  94. },
  95. );
  96. },
  97. );
  98. }
  99. }
  100. class AppGlobals {
  101. static GlobalKey<NavigatorState> rootNavKey = GlobalKey();
  102. static NavigatorState get nav => rootNavKey.currentState!;
  103. }
  104. class ApplicationBlocObserver extends BlocObserver {
  105. @override
  106. // ignore: unnecessary_overrides
  107. void onTransition(Bloc bloc, Transition transition) {
  108. // Log.debug("[current]: ${transition.currentState} \n\n[next]: ${transition.nextState}");
  109. // Log.debug("${transition.nextState}");
  110. super.onTransition(bloc, transition);
  111. }
  112. @override
  113. void onError(BlocBase bloc, Object error, StackTrace stackTrace) {
  114. Log.debug(error);
  115. super.onError(bloc, error, stackTrace);
  116. }
  117. // @override
  118. // void onEvent(Bloc bloc, Object? event) {
  119. // Log.debug("$event");
  120. // super.onEvent(bloc, event);
  121. // }
  122. }