| Flutter iOS Embedder |

FlutterEngine.h
Go to the documentation of this file.
1 // Copyright 2013 The Flutter Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
4
5 #ifndef FLUTTER_SHELL_PLATFORM_DARWIN_IOS_FRAMEWORK_HEADERS_FLUTTERENGINE_H_
6 #define FLUTTER_SHELL_PLATFORM_DARWIN_IOS_FRAMEWORK_HEADERS_FLUTTERENGINE_H_
7
8 #import <Foundation/Foundation.h>
9 #import <UIKit/UIKit.h>
10
11 #import "FlutterBinaryMessenger.h"
12 #import "FlutterDartProject.h"
13 #import "FlutterMacros.h"
14 #import "FlutterPlugin.h"
15 #import "FlutterTexture.h"
16
17 @class FlutterViewController;
18
19 NS_ASSUME_NONNULL_BEGIN
20
21 /**
22 * The dart entrypoint that is associated with `main()`. This is to be used as an argument to the
23 * `runWithEntrypoint*` methods.
24 */
25 // NOLINTNEXTLINE(readability-identifier-naming)
26 extern NSString* const FlutterDefaultDartEntrypoint;
27
28 /**
29 * The default Flutter initial route ("/").
30 */
31 // NOLINTNEXTLINE(readability-identifier-naming)
32 extern NSString* const FlutterDefaultInitialRoute;
33
34 /**
35 * The FlutterEngine class coordinates a single instance of execution for a
36 * `FlutterDartProject`. It may have zero or one `FlutterViewController` at a
37 * time, which can be specified via `-setViewController:`.
38 * `FlutterViewController`'s `initWithEngine` initializer will automatically call
39 * `-setViewController:` for itself.
40 *
41 * A FlutterEngine can be created independently of a `FlutterViewController` for
42 * headless execution. It can also persist across the lifespan of multiple
43 * `FlutterViewController` instances to maintain state and/or asynchronous tasks
44 * (such as downloading a large file).
45 *
46 * A FlutterEngine can also be used to prewarm the Dart execution environment and reduce the
47 * latency of showing the Flutter screen when a `FlutterViewController` is created and presented.
48 * See http://flutter.dev/docs/development/add-to-app/performance for more details on loading
49 * performance.
50 *
51 * Alternatively, you can simply create a new `FlutterViewController` with only a
52 * `FlutterDartProject`. That `FlutterViewController` will internally manage its
53 * own instance of a FlutterEngine, but will not guarantee survival of the engine
54 * beyond the life of the ViewController.
55 *
56 * A newly initialized FlutterEngine will not actually run a Dart Isolate until
57 * either `-runWithEntrypoint:` or `-runWithEntrypoint:libraryURI` is invoked.
58 * One of these methods must be invoked before calling `-setViewController:`.
59 */
60 FLUTTER_DARWIN_EXPORT
61 @interface FlutterEngine : NSObject <FlutterPluginRegistry>
62
63 /**
64 * Default initializer for a FlutterEngine.
65 *
66 * Threads created by this FlutterEngine will appear as "FlutterEngine #" in
67 * Instruments. The prefix can be customized using `initWithName`.
68 *
69 * The engine will execute the project located in the bundle with the identifier
70 * "io.flutter.flutter.app" (the default for Flutter projects).
71 *
72 * A newly initialized engine will not run until either `-runWithEntrypoint:` or
73 * `-runWithEntrypoint:libraryURI:` is called.
74 *
75 * FlutterEngine created with this method will have allowHeadlessExecution set to `YES`.
76 * This means that the engine will continue to run regardless of whether a `FlutterViewController`
77 * is attached to it or not, until `-destroyContext:` is called or the process finishes.
78 */
79 - (instancetype)init;
80
81 /**
82 * Initialize this FlutterEngine.
83 *
84 * The engine will execute the project located in the bundle with the identifier
85 * "io.flutter.flutter.app" (the default for Flutter projects).
86 *
87 * A newly initialized engine will not run until either `-runWithEntrypoint:` or
88 * `-runWithEntrypoint:libraryURI:` is called.
89 *
90 * FlutterEngine created with this method will have allowHeadlessExecution set to `YES`.
91 * This means that the engine will continue to run regardless of whether a `FlutterViewController`
92 * is attached to it or not, until `-destroyContext:` is called or the process finishes.
93 *
94 * @param labelPrefix The label prefix used to identify threads for this instance. Should
95 * be unique across FlutterEngine instances, and is used in instrumentation to label
96 * the threads used by this FlutterEngine.
97 */
98 - (instancetype)initWithName:(NSString*)labelPrefix;
99
100 /**
101 * Initialize this FlutterEngine with a `FlutterDartProject`.
102 *
103 * If the FlutterDartProject is not specified, the FlutterEngine will attempt to locate
104 * the project in a default location (the flutter_assets folder in the iOS application
105 * bundle).
106 *
107 * A newly initialized engine will not run the `FlutterDartProject` until either
108 * `-runWithEntrypoint:` or `-runWithEntrypoint:libraryURI:` is called.
109 *
110 * FlutterEngine created with this method will have allowHeadlessExecution set to `YES`.
111 * This means that the engine will continue to run regardless of whether a `FlutterViewController`
112 * is attached to it or not, until `-destroyContext:` is called or the process finishes.
113 *
114 * @param labelPrefix The label prefix used to identify threads for this instance. Should
115 * be unique across FlutterEngine instances, and is used in instrumentation to label
116 * the threads used by this FlutterEngine.
117 * @param project The `FlutterDartProject` to run.
118 */
119 - (instancetype)initWithName:(NSString*)labelPrefix project:(nullable FlutterDartProject*)project;
120
121 /**
122 * Initialize this FlutterEngine with a `FlutterDartProject`.
123 *
124 * If the FlutterDartProject is not specified, the FlutterEngine will attempt to locate
125 * the project in a default location (the flutter_assets folder in the iOS application
126 * bundle).
127 *
128 * A newly initialized engine will not run the `FlutterDartProject` until either
129 * `-runWithEntrypoint:` or `-runWithEntrypoint:libraryURI:` is called.
130 *
131 * @param labelPrefix The label prefix used to identify threads for this instance. Should
132 * be unique across FlutterEngine instances, and is used in instrumentation to label
133 * the threads used by this FlutterEngine.
134 * @param project The `FlutterDartProject` to run.
135 * @param allowHeadlessExecution Whether or not to allow this instance to continue
136 * running after passing a nil `FlutterViewController` to `-setViewController:`.
137 */
138 - (instancetype)initWithName:(NSString*)labelPrefix
139 project:(nullable FlutterDartProject*)project
140 allowHeadlessExecution:(BOOL)allowHeadlessExecution;
141
142 /**
143 * Initialize this FlutterEngine with a `FlutterDartProject`.
144 *
145 * If the FlutterDartProject is not specified, the FlutterEngine will attempt to locate
146 * the project in a default location (the flutter_assets folder in the iOS application
147 * bundle).
148 *
149 * A newly initialized engine will not run the `FlutterDartProject` until either
150 * `-runWithEntrypoint:` or `-runWithEntrypoint:libraryURI:` is called.
151 *
152 * @param labelPrefix The label prefix used to identify threads for this instance. Should
153 * be unique across FlutterEngine instances, and is used in instrumentation to label
154 * the threads used by this FlutterEngine.
155 * @param project The `FlutterDartProject` to run.
156 * @param allowHeadlessExecution Whether or not to allow this instance to continue
157 * running after passing a nil `FlutterViewController` to `-setViewController:`.
158 * @param restorationEnabled Whether state restoration is enabled. When true, the framework will
159 * wait for the attached view controller to provide restoration data.
160 */
161 - (instancetype)initWithName:(NSString*)labelPrefix
162 project:(nullable FlutterDartProject*)project
163 allowHeadlessExecution:(BOOL)allowHeadlessExecution
164 restorationEnabled:(BOOL)restorationEnabled NS_DESIGNATED_INITIALIZER;
165
166 /**
167 * Runs a Dart program on an Isolate from the main Dart library (i.e. the library that
168 * contains `main()`), using `main()` as the entrypoint (the default for Flutter projects),
169 * and using "/" (the default route) as the initial route.
170 *
171 * The first call to this method will create a new Isolate. Subsequent calls will return
172 * immediately and have no effect.
173 *
174 * @return YES if the call succeeds in creating and running a Flutter Engine instance; NO otherwise.
175 */
176 - (BOOL)run;
177
178 /**
179 * Runs a Dart program on an Isolate from the main Dart library (i.e. the library that
180 * contains `main()`), using "/" (the default route) as the initial route.
181 *
182 * The first call to this method will create a new Isolate. Subsequent calls will return
183 * immediately and have no effect.
184 *
185 * @param entrypoint The name of a top-level function from the same Dart
186 * library that contains the app's main() function. If this is FlutterDefaultDartEntrypoint (or
187 * nil) it will default to `main()`. If it is not the app's main() function, that function must
188 * be decorated with `@pragma(vm:entry-point)` to ensure the method is not tree-shaken by the Dart
189 * compiler.
190 * @return YES if the call succeeds in creating and running a Flutter Engine instance; NO otherwise.
191 */
192 - (BOOL)runWithEntrypoint:(nullable NSString*)entrypoint;
193
194 /**
195 * Runs a Dart program on an Isolate from the main Dart library (i.e. the library that
196 * contains `main()`).
197 *
198 * The first call to this method will create a new Isolate. Subsequent calls will return
199 * immediately and have no effect.
200 *
201 * @param entrypoint The name of a top-level function from the same Dart
202 * library that contains the app's main() function. If this is FlutterDefaultDartEntrypoint (or
203 * nil), it will default to `main()`. If it is not the app's main() function, that function must
204 * be decorated with `@pragma(vm:entry-point)` to ensure the method is not tree-shaken by the Dart
205 * compiler.
206 * @param initialRoute The name of the initial Flutter `Navigator` `Route` to load. If this is
207 * FlutterDefaultInitialRoute (or nil), it will default to the "/" route.
208 * @return YES if the call succeeds in creating and running a Flutter Engine instance; NO otherwise.
209 */
210 - (BOOL)runWithEntrypoint:(nullable NSString*)entrypoint
211 initialRoute:(nullable NSString*)initialRoute;
212
213 /**
214 * Runs a Dart program on an Isolate using the specified entrypoint and Dart library,
215 * which may not be the same as the library containing the Dart program's `main()` function.
216 *
217 * The first call to this method will create a new Isolate. Subsequent calls will return
218 * immediately and have no effect.
219 *
220 * @param entrypoint The name of a top-level function from a Dart library. If this is
221 * FlutterDefaultDartEntrypoint (or nil); this will default to `main()`. If it is not the app's
222 * main() function, that function must be decorated with `@pragma(vm:entry-point)` to ensure the
223 * method is not tree-shaken by the Dart compiler.
224 * @param uri The URI of the Dart library which contains the entrypoint method
225 * (example "package:foo_package/main.dart"). If nil, this will default to
226 * the same library as the `main()` function in the Dart program.
227 * @return YES if the call succeeds in creating and running a Flutter Engine instance; NO otherwise.
228 */
229 - (BOOL)runWithEntrypoint:(nullable NSString*)entrypoint libraryURI:(nullable NSString*)uri;
230
231 /**
232 * Runs a Dart program on an Isolate using the specified entrypoint and Dart library,
233 * which may not be the same as the library containing the Dart program's `main()` function.
234 *
235 * The first call to this method will create a new Isolate. Subsequent calls will return
236 * immediately and have no effect.
237 *
238 * @param entrypoint The name of a top-level function from a Dart library. If this is
239 * FlutterDefaultDartEntrypoint (or nil); this will default to `main()`. If it is not the app's
240 * main() function, that function must be decorated with `@pragma(vm:entry-point)` to ensure the
241 * method is not tree-shaken by the Dart compiler.
242 * @param libraryURI The URI of the Dart library which contains the entrypoint
243 * method (example "package:foo_package/main.dart"). If nil, this will
244 * default to the same library as the `main()` function in the Dart program.
245 * @param initialRoute The name of the initial Flutter `Navigator` `Route` to load. If this is
246 * FlutterDefaultInitialRoute (or nil), it will default to the "/" route.
247 * @return YES if the call succeeds in creating and running a Flutter Engine instance; NO otherwise.
248 */
249 - (BOOL)runWithEntrypoint:(nullable NSString*)entrypoint
250 libraryURI:(nullable NSString*)libraryURI
251 initialRoute:(nullable NSString*)initialRoute;
252
253 /**
254 * Runs a Dart program on an Isolate using the specified entrypoint and Dart library,
255 * which may not be the same as the library containing the Dart program's `main()` function.
256 *
257 * The first call to this method will create a new Isolate. Subsequent calls will return
258 * immediately and have no effect.
259 *
260 * @param entrypoint The name of a top-level function from a Dart library. If this is
261 * FlutterDefaultDartEntrypoint (or nil); this will default to `main()`. If it is not the app's
262 * main() function, that function must be decorated with `@pragma(vm:entry-point)` to ensure the
263 * method is not tree-shaken by the Dart compiler.
264 * @param libraryURI The URI of the Dart library which contains the entrypoint
265 * method (example "package:foo_package/main.dart"). If nil, this will
266 * default to the same library as the `main()` function in the Dart program.
267 * @param initialRoute The name of the initial Flutter `Navigator` `Route` to load. If this is
268 * FlutterDefaultInitialRoute (or nil), it will default to the "/" route.
269 * @param entrypointArgs Arguments passed as a list of string to Dart's entrypoint function.
270 * @return YES if the call succeeds in creating and running a Flutter Engine instance; NO otherwise.
271 */
272 - (BOOL)runWithEntrypoint:(nullable NSString*)entrypoint
273 libraryURI:(nullable NSString*)libraryURI
274 initialRoute:(nullable NSString*)initialRoute
275 entrypointArgs:(nullable NSArray<NSString*>*)entrypointArgs;
276
277 /**
278 * Destroy running context for an engine.
279 *
280 * This method can be used to force the FlutterEngine object to release all resources.
281 * After sending this message, the object will be in an unusable state until it is deallocated.
282 * Accessing properties or sending messages to it will result in undefined behavior or runtime
283 * errors.
284 */
285 - (void)destroyContext;
286
287 /**
288 * Ensures that Flutter will generate a semantics tree.
289 *
290 * This is enabled by default if certain accessibility services are turned on by
291 * the user, or when using a Simulator. This method allows a user to turn
292 * semantics on when they would not ordinarily be generated and the performance
293 * overhead is not a concern, e.g. for UI testing. Note that semantics should
294 * never be programmatically turned off, as it would potentially disable
295 * accessibility services an end user has requested.
296 *
297 * This method must only be called after launching the engine via
298 * `-runWithEntrypoint:` or `-runWithEntryPoint:libraryURI`.
299 *
300 * Although this method returns synchronously, it does not guarantee that a
301 * semantics tree is actually available when the method returns. It
302 * synchronously ensures that the next frame the Flutter framework creates will
303 * have a semantics tree.
304 *
305 * You can subscribe to semantics updates via `NSNotificationCenter` by adding
306 * an observer for the name `FlutterSemanticsUpdateNotification`. The `object`
307 * parameter will be the `FlutterViewController` associated with the semantics
308 * update. This will asynchronously fire after a semantics tree has actually
309 * built (which may be some time after the frame has been rendered).
310 */
311 - (void)ensureSemanticsEnabled;
312
313 /**
314 * Sets the `FlutterViewController` for this instance. The FlutterEngine must be
315 * running (e.g. a successful call to `-runWithEntrypoint:` or `-runWithEntrypoint:libraryURI`)
316 * before calling this method. Callers may pass nil to remove the viewController
317 * and have the engine run headless in the current process.
318 *
319 * A FlutterEngine can only have one `FlutterViewController` at a time. If there is
320 * already a `FlutterViewController` associated with this instance, this method will replace
321 * the engine's current viewController with the newly specified one.
322 *
323 * Setting the viewController will signal the engine to start animations and drawing, and unsetting
324 * it will signal the engine to stop animations and drawing. However, neither will impact the state
325 * of the Dart program's execution.
326 */
327 @property(nonatomic, weak) FlutterViewController* viewController;
328
329 /**
330 * The `FlutterMethodChannel` used for localization related platform messages, such as
331 * setting the locale.
332 *
333 * Can be nil after `destroyContext` is called.
334 */
335 @property(nonatomic, readonly, nullable) FlutterMethodChannel* localizationChannel;
336 /**
337 * The `FlutterMethodChannel` used for navigation related platform messages.
338 *
339 * Can be nil after `destroyContext` is called.
340 *
341 * @see [Navigation
342 * Channel](https://api.flutter.dev/flutter/services/SystemChannels/navigation-constant.html)
343 * @see [Navigator Widget](https://api.flutter.dev/flutter/widgets/Navigator-class.html)
344 */
345 @property(nonatomic, readonly) FlutterMethodChannel* navigationChannel;
346
347 /**
348 * The `FlutterMethodChannel` used for restoration related platform messages.
349 *
350 * Can be nil after `destroyContext` is called.
351 *
352 * @see [Restoration
353 * Channel](https://api.flutter.dev/flutter/services/SystemChannels/restoration-constant.html)
354 */
355 @property(nonatomic, readonly) FlutterMethodChannel* restorationChannel;
356
357 /**
358 * The `FlutterMethodChannel` used for core platform messages, such as
359 * information about the screen orientation.
360 *
361 * Can be nil after `destroyContext` is called.
362 */
363 @property(nonatomic, readonly) FlutterMethodChannel* platformChannel;
364
365 /**
366 * The `FlutterMethodChannel` used to communicate text input events to the
367 * Dart Isolate.
368 *
369 * Can be nil after `destroyContext` is called.
370 *
371 * @see [Text Input
372 * Channel](https://api.flutter.dev/flutter/services/SystemChannels/textInput-constant.html)
373 */
374 @property(nonatomic, readonly) FlutterMethodChannel* textInputChannel;
375
376 /**
377 * The `FlutterBasicMessageChannel` used to communicate app lifecycle events
378 * to the Dart Isolate.
379 *
380 * Can be nil after `destroyContext` is called.
381 *
382 * @see [Lifecycle
383 * Channel](https://api.flutter.dev/flutter/services/SystemChannels/lifecycle-constant.html)
384 */
385 @property(nonatomic, readonly) FlutterBasicMessageChannel* lifecycleChannel;
386
387 /**
388 * The `FlutterBasicMessageChannel` used for communicating system events, such as
389 * memory pressure events.
390 *
391 * Can be nil after `destroyContext` is called.
392 *
393 * @see [System
394 * Channel](https://api.flutter.dev/flutter/services/SystemChannels/system-constant.html)
395 */
396 @property(nonatomic, readonly) FlutterBasicMessageChannel* systemChannel;
397
398 /**
399 * The `FlutterBasicMessageChannel` used for communicating user settings such as
400 * clock format and text scale.
401 *
402 * Can be nil after `destroyContext` is called.
403 */
404 @property(nonatomic, readonly) FlutterBasicMessageChannel* settingsChannel;
405
406 /**
407 * The `FlutterBasicMessageChannel` used for communicating key events
408 * from physical keyboards
409 *
410 * Can be nil after `destroyContext` is called.
411 */
412 @property(nonatomic, readonly) FlutterBasicMessageChannel* keyEventChannel;
413
414 /**
415 * The `NSURL` of the Dart VM Service for the service isolate.
416 *
417 * This is only set in debug and profile runtime modes, and only after the
418 * Dart VM Service is ready. In release mode or before the Dart VM Service has
419 * started, it returns `nil`.
420 */
421 @property(nonatomic, readonly, nullable) NSURL* vmServiceUrl;
422
423 /**
424 * The `FlutterBinaryMessenger` associated with this FlutterEngine (used for communicating with
425 * channels).
426 */
427 @property(nonatomic, readonly) NSObject<FlutterBinaryMessenger>* binaryMessenger;
428
429 /**
430 * The `FlutterTextureRegistry` associated with this FlutterEngine (used to register textures).
431 */
432 @property(nonatomic, readonly) NSObject<FlutterTextureRegistry>* textureRegistry;
433
434 /**
435 * The UI Isolate ID of the engine.
436 *
437 * This property will be nil if the engine is not running.
438 */
439 @property(nonatomic, readonly, copy, nullable) NSString* isolateId;
440
441 /**
442 * Whether or not GPU calls are allowed.
443 *
444 * Typically this is set when the app is backgrounded and foregrounded.
445 */
446 @property(nonatomic, assign) BOOL isGpuDisabled;
447
448 @end
449
450 NS_ASSUME_NONNULL_END
451
452 #endif // FLUTTER_SHELL_PLATFORM_DARWIN_IOS_FRAMEWORK_HEADERS_FLUTTERENGINE_H_
FlutterBinaryMessenger.h
FlutterDartProject.h
FlutterDefaultDartEntrypoint
NS_ASSUME_NONNULL_BEGIN NSString *const FlutterDefaultDartEntrypoint
Definition: FlutterEngine.mm:84
FlutterDefaultInitialRoute
NSString *const FlutterDefaultInitialRoute
Definition: FlutterEngine.mm:85
FlutterMacros.h
NS_ASSUME_NONNULL_BEGIN
#define NS_ASSUME_NONNULL_BEGIN
Definition: FlutterMacros.h:19
NS_ASSUME_NONNULL_END
#define NS_ASSUME_NONNULL_END
Definition: FlutterMacros.h:20
FLUTTER_DARWIN_EXPORT
#define FLUTTER_DARWIN_EXPORT
Definition: FlutterMacros.h:14
FlutterPlugin.h
viewController
FlutterViewController * viewController
Definition: FlutterTextInputPluginTest.mm:139
FlutterTexture.h
FlutterDartProject
Definition: FlutterDartProject.mm:263
FlutterBasicMessageChannel
Definition: FlutterChannels.h:38
FlutterEngine
Definition: FlutterEngine.h:61
FlutterEngine::textInputChannel
FlutterMethodChannel * textInputChannel
Definition: FlutterEngine.h:374
-[FlutterEngine run]
BOOL run()
Definition: FlutterEngine.mm:896
-[FlutterEngine init]
instancetype init()
Definition: FlutterEngine.mm:169
FlutterEngine::vmServiceUrl
NSURL * vmServiceUrl
Definition: FlutterEngine.h:421
FlutterEngine::navigationChannel
FlutterMethodChannel * navigationChannel
Definition: FlutterEngine.h:345
FlutterEngine::keyEventChannel
FlutterBasicMessageChannel * keyEventChannel
Definition: FlutterEngine.h:412
-[FlutterEngine destroyContext]
void destroyContext()
Definition: FlutterEngine.mm:499
FlutterEngine::lifecycleChannel
FlutterBasicMessageChannel * lifecycleChannel
Definition: FlutterEngine.h:385
FlutterEngine::platformChannel
FlutterMethodChannel * platformChannel
Definition: FlutterEngine.h:363
FlutterEngine::localizationChannel
FlutterMethodChannel * localizationChannel
Definition: FlutterEngine.h:335
FlutterEngine::textureRegistry
NSObject< FlutterTextureRegistry > * textureRegistry
Definition: FlutterEngine.h:432
FlutterEngine::isolateId
NSString * isolateId
Definition: FlutterEngine.h:439
FlutterEngine::systemChannel
FlutterBasicMessageChannel * systemChannel
Definition: FlutterEngine.h:396
FlutterEngine::settingsChannel
FlutterBasicMessageChannel * settingsChannel
Definition: FlutterEngine.h:404
FlutterEngine::restorationChannel
FlutterMethodChannel * restorationChannel
Definition: FlutterEngine.h:355
FlutterEngine::binaryMessenger
NSObject< FlutterBinaryMessenger > * binaryMessenger
Definition: FlutterEngine.h:427
-[FlutterEngine ensureSemanticsEnabled]
void ensureSemanticsEnabled()
Definition: FlutterEngine.mm:442
FlutterEngine::isGpuDisabled
BOOL isGpuDisabled
Definition: FlutterEngine.h:446
FlutterMethodChannel
Definition: FlutterChannels.h:221
FlutterViewController
Definition: FlutterViewController.h:57
FlutterPluginRegistry-p
Definition: FlutterPlugin.h:402