blob: 6d76f0c005c840e95b937e18ad5e07186b0d38da [file] [log] [blame]
// Copyright 2013 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
import 'package:js/js.dart';
import 'configuration.dart';
import 'js_interop/js_loader.dart';
import 'js_interop/js_promise.dart';
/// The type of a function that initializes an engine (in Dart).
typedef InitEngineFn = Future<void> Function([JsFlutterConfiguration? params]);
/// A class that controls the coarse lifecycle of a Flutter app.
class AppBootstrap {
/// Construct an AppBootstrap.
AppBootstrap({required InitEngineFn initializeEngine, required Function runApp}) :
_initializeEngine = initializeEngine, _runApp = runApp;
// A function to initialize the engine.
final InitEngineFn _initializeEngine;
// A function to run the app.
//
// TODO(dit): Be more strict with the typedef of this function, so we can add
// typed params to the function. (See InitEngineFn).
final Function _runApp;
/// Immediately bootstraps the app.
///
/// This calls `initEngine` and `runApp` in succession.
Future<void> autoStart() async {
await _initializeEngine();
await _runApp();
}
/// Creates an engine initializer that runs our encapsulated initEngine function.
FlutterEngineInitializer prepareEngineInitializer() {
return FlutterEngineInitializer(
// This is a convenience method that lets the programmer call "autoStart"
// from JavaScript immediately after the main.dart.js has loaded.
// Returns a promise that resolves to the Flutter app that was started.
autoStart: allowInterop(() {
return Promise<FlutterApp>(allowInterop((
PromiseResolver<FlutterApp> resolve,
PromiseRejecter _,
) async {
await autoStart();
// Return the App that was just started
resolve(_prepareFlutterApp());
}));
}),
// Calls [_initEngine], and returns a JS Promise that resolves to an
// app runner object.
initializeEngine: allowInterop(([JsFlutterConfiguration? configuration]) {
// `params` coming from Javascript may be used to configure the engine intialization.
// The internal `initEngine` function must accept those params.
return Promise<FlutterAppRunner>(allowInterop((
PromiseResolver<FlutterAppRunner> resolve,
PromiseRejecter _,
) async {
await _initializeEngine(configuration);
// Return an app runner object
resolve(_prepareAppRunner());
}));
}),
);
}
/// Creates an appRunner that runs our encapsulated runApp function.
FlutterAppRunner _prepareAppRunner() {
return FlutterAppRunner(runApp: allowInterop(([RunAppFnParameters? params]) {
// `params` coming from JS may be used to configure the run app method.
return Promise<FlutterApp>(allowInterop((
PromiseResolver<FlutterApp> resolve,
PromiseRejecter _,
) async {
await _runApp();
// Return the App that was just started
resolve(_prepareFlutterApp());
}));
}));
}
/// Represents the App that was just started, and its JS API.
FlutterApp _prepareFlutterApp() {
return FlutterApp();
}
}