| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126 | import 'dart:io';import 'package:app_flowy/startup/plugin/plugin.dart';import 'package:app_flowy/startup/tasks/prelude.dart';import 'package:app_flowy/startup/deps_resolver.dart';import 'package:flutter/foundation.dart';import 'package:flutter/material.dart';import 'package:get_it/get_it.dart';import 'package:flowy_sdk/flowy_sdk.dart';// [[diagram: flowy startup flow]]//                   ┌──────────┐//                   │ FlowyApp │//                   └──────────┘//                         │  impl//                         ▼// ┌────────┐  1.run ┌──────────┐// │ System │───┬───▶│EntryPoint│// └────────┘   │    └──────────┘         ┌─────────────────┐//              │                    ┌──▶ │ RustSDKInitTask │//              │    ┌───────────┐   │    └─────────────────┘//              └──▶ │AppLauncher│───┤//        2.launch   └───────────┘   │    ┌─────────────┐         ┌──────────────────┐      ┌───────────────┐//                                   └───▶│AppWidgetTask│────────▶│ApplicationWidget │─────▶│ SplashScreen  │//                                        └─────────────┘         └──────────────────┘      └───────────────┘////                                                 3.build MeterialAppfinal getIt = GetIt.instance;abstract class EntryPoint {  Widget create();}class FlowyRunner {  static Future<void> run(EntryPoint f) async {    // Specify the env    final env = integrationEnv();    initGetIt(getIt, env, f);    // add task    getIt<AppLauncher>().addTask(InitRustSDKTask());    getIt<AppLauncher>().addTask(PluginLoadTask());    if (!env.isTest()) {      getIt<AppLauncher>().addTask(InitAppWidgetTask());      getIt<AppLauncher>().addTask(InitPlatformServiceTask());    }    // execute the tasks    getIt<AppLauncher>().launch();  }}Future<void> initGetIt(  GetIt getIt,  IntegrationMode env,  EntryPoint f,) async {  getIt.registerFactory<EntryPoint>(() => f);  getIt.registerLazySingleton<FlowySDK>(() => const FlowySDK());  getIt.registerLazySingleton<AppLauncher>(() => AppLauncher(env, getIt));  getIt.registerSingleton<PluginSandbox>(PluginSandbox());  await DependencyResolver.resolve(getIt);}class LaunchContext {  GetIt getIt;  IntegrationMode env;  LaunchContext(this.getIt, this.env);}enum LaunchTaskType {  dataProcessing,  appLauncher,}/// The interface of an app launch task, which will trigger/// some nonresident indispensable task in app launching task.abstract class LaunchTask {  LaunchTaskType get type => LaunchTaskType.dataProcessing;  Future<void> initialize(LaunchContext context);}class AppLauncher {  List<LaunchTask> tasks;  IntegrationMode env;  GetIt getIt;  AppLauncher(this.env, this.getIt) : tasks = List.from([]);  void addTask(LaunchTask task) {    tasks.add(task);  }  Future<void> launch() async {    final context = LaunchContext(getIt, env);    for (var task in tasks) {      await task.initialize(context);    }  }}enum IntegrationMode {  develop,  release,  test,}extension IntegrationEnvExt on IntegrationMode {  bool isTest() {    return this == IntegrationMode.test;  }}IntegrationMode integrationEnv() {  if (Platform.environment.containsKey('FLUTTER_TEST')) {    return IntegrationMode.test;  }  if (kReleaseMode) {    return IntegrationMode.release;  }  return IntegrationMode.develop;}
 |