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-03-01 15:55:52 +00:00
|
|
|
import 'package:app_flowy/startup/home_deps_resolver.dart';
|
|
|
|
import 'package:app_flowy/startup/user_deps_resolver.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';
|
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();
|
2022-02-20 00:35:52 +00:00
|
|
|
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,
|
2022-02-20 00:35:52 +00:00
|
|
|
EntryPoint f,
|
2021-10-11 05:15:41 +00:00
|
|
|
) async {
|
2022-02-20 00:35:52 +00:00
|
|
|
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
|
|
|
}
|