AppFlowy/frontend/app_flowy/lib/startup/startup.dart

129 lines
4.0 KiB
Dart
Raw Normal View History

2022-02-19 15:19:33 +00:00
import 'dart:io';
2022-02-28 14:38:53 +00:00
import 'package:app_flowy/plugin/plugin.dart';
2021-06-19 15:41:19 +00:00
import 'package:app_flowy/startup/tasks/prelude.dart';
2022-02-20 01:58:25 +00:00
import 'package:flutter/foundation.dart';
2021-06-19 15:41:19 +00:00
import 'package:flutter/material.dart';
import 'package:get_it/get_it.dart';
import 'package:app_flowy/startup/deps_resolver.dart';
import 'package:app_flowy/user/presentation/deps_resolver.dart';
2021-10-11 05:15:41 +00:00
import 'package:flowy_sdk/flowy_sdk.dart';
2021-06-19 15:41:19 +00:00
2021-10-11 05:15:41 +00:00
// [[diagram: flowy startup flow]]
// ┌──────────┐
// │ FlowyApp │
// └──────────┘
// │ impl
// ▼
// ┌────────┐ 1.run ┌──────────┐
// │ System │───┬───▶│EntryPoint│
// └────────┘ │ └──────────┘ ┌─────────────────┐
// │ ┌──▶ │ RustSDKInitTask │
// │ ┌───────────┐ │ └─────────────────┘
// └──▶ │AppLauncher│───┤
// 2.launch └───────────┘ │ ┌─────────────┐ ┌──────────────────┐ ┌───────────────┐
// └───▶│AppWidgetTask│────────▶│ApplicationWidget │─────▶│ SplashScreen │
// └─────────────┘ └──────────────────┘ └───────────────┘
//
// 3.build MeterialApp
2021-06-19 15:41:19 +00:00
final getIt = GetIt.instance;
2021-09-12 14:19:59 +00:00
abstract class EntryPoint {
2021-06-19 15:41:19 +00:00
Widget create();
}
2022-02-20 08:10:50 +00:00
class FlowyRunner {
2022-02-19 09:12:44 +00:00
static Future<void> run(EntryPoint f) async {
2021-11-19 07:23:58 +00:00
// Specify the env
2022-02-19 15:19:33 +00:00
final env = integrationEnv();
initGetIt(getIt, env, f);
2021-06-19 15:41:19 +00:00
// add task
2021-12-04 14:24:32 +00:00
getIt<AppLauncher>().addTask(InitRustSDKTask());
2022-02-19 15:19:33 +00:00
if (!env.isTest()) {
2022-02-28 14:38:53 +00:00
getIt<AppLauncher>().addTask(PluginLoadTask());
2022-02-20 08:10:50 +00:00
getIt<AppLauncher>().addTask(InitAppWidgetTask());
getIt<AppLauncher>().addTask(InitPlatformServiceTask());
2022-02-19 15:19:33 +00:00
}
2021-06-19 15:41:19 +00:00
// execute the tasks
getIt<AppLauncher>().launch();
}
}
2021-10-11 05:15:41 +00:00
Future<void> initGetIt(
GetIt getIt,
2022-02-20 08:34:15 +00:00
IntegrationMode env,
EntryPoint f,
2021-10-11 05:15:41 +00:00
) async {
getIt.registerFactory<EntryPoint>(() => f);
2021-10-11 05:15:41 +00:00
getIt.registerLazySingleton<FlowySDK>(() => const FlowySDK());
getIt.registerLazySingleton<AppLauncher>(() => AppLauncher(env, getIt));
2022-02-28 14:38:53 +00:00
getIt.registerSingleton<PluginSandbox>(PluginSandbox());
2021-10-11 05:15:41 +00:00
await UserDepsResolver.resolve(getIt);
await HomeDepsResolver.resolve(getIt);
}
2022-02-19 05:52:52 +00:00
class LaunchContext {
GetIt getIt;
2022-02-20 08:34:15 +00:00
IntegrationMode env;
2022-02-19 05:52:52 +00:00
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;
2022-02-20 08:34:15 +00:00
IntegrationMode env;
2022-02-19 05:52:52 +00:00
GetIt getIt;
AppLauncher(this.env, this.getIt) : tasks = List.from([]);
void addTask(LaunchTask task) {
tasks.add(task);
}
2022-02-19 09:12:44 +00:00
Future<void> launch() async {
2022-02-19 05:52:52 +00:00
final context = LaunchContext(getIt, env);
for (var task in tasks) {
await task.initialize(context);
}
}
}
2022-02-19 15:19:33 +00:00
2022-02-20 08:34:15 +00:00
enum IntegrationMode {
2022-02-19 15:19:33 +00:00
develop,
release,
test,
}
2022-02-20 08:34:15 +00:00
extension IntegrationEnvExt on IntegrationMode {
2022-02-19 15:19:33 +00:00
bool isTest() {
2022-02-20 08:34:15 +00:00
return this == IntegrationMode.test;
2022-02-19 15:19:33 +00:00
}
}
2022-02-20 08:34:15 +00:00
IntegrationMode integrationEnv() {
2022-02-19 15:19:33 +00:00
if (Platform.environment.containsKey('FLUTTER_TEST')) {
2022-02-20 08:34:15 +00:00
return IntegrationMode.test;
2022-02-19 15:19:33 +00:00
}
2022-02-20 01:58:25 +00:00
if (kReleaseMode) {
2022-02-20 08:34:15 +00:00
return IntegrationMode.release;
2022-02-19 15:19:33 +00:00
}
2022-02-20 08:34:15 +00:00
return IntegrationMode.develop;
2022-02-19 15:19:33 +00:00
}