| Flutter iOS Embedder |

Instance Methods | Class Methods | Properties | List of all members
FlutterViewController Class Reference

`#import <FlutterViewController.h>`

Inheritance diagram for FlutterViewController:

## Instance Methods
(instancetype) | - initWithEngine:nibName:bundle:
(instancetype) | - initWithProject:nibName:bundle:
(instancetype) | - initWithProject:initialRoute:nibName:bundle:
(instancetype) | - initWithCoder:
(void) | - setFlutterViewDidRenderCallback:
(NSString *) | - lookupKeyForAsset:
(NSString *) | - lookupKeyForAsset:fromPackage:
(void) | - setInitialRoute:
(void) | - popRoute
(void) | - pushRoute:
(id< FlutterPluginRegistry >) | - pluginRegistry
(BOOL) | - loadDefaultSplashScreenView
Instance Methods inherited from <FlutterTextureRegistry>
(int64_t) | - registerTexture:
(void) | - textureFrameAvailable:
(void) | - unregisterTexture:
Instance Methods inherited from <FlutterPluginRegistry>
(nullable NSObject< FlutterPluginRegistrar > *) | - registrarForPlugin:
(BOOL) | - hasPlugin:
(nullable NSObject *) | - valuePublishedByPlugin:

## Class Methods
(BOOL) | + isUIAccessibilityIsVoiceOverRunning

## Properties
BOOL | displayingFlutterUI
UIView * | splashScreenView
BOOL | viewOpaque
FlutterEngine * | engine
NSObject< FlutterBinaryMessenger > * | binaryMessenger
BOOL | engineAllowHeadlessExecution
BOOL | autoResizable

## Detailed Description

A `UIViewController` implementation for Flutter views.

Dart execution, channel communication, texture registration, and plugin registration are all handled by `FlutterEngine`. Calls on this class to those members all proxy through to the `FlutterEngine` attached FlutterViewController.

A FlutterViewController can be initialized either with an already-running `FlutterEngine` via the `initWithEngine:` initializer, or it can be initialized with a `FlutterDartProject` that will be used to implicitly spin up a new `FlutterEngine`. Creating a `FlutterEngine` before showing a FlutterViewController can be used to pre-initialize the Dart VM and to prepare the isolate in order to reduce the latency to the first rendered frame. See https://docs.flutter.dev/development/add-to-app/performance for more details on loading latency.

Holding a `FlutterEngine` independently of FlutterViewControllers can also be used to not to lose Dart-related state and asynchronous tasks when navigating back and forth between a FlutterViewController and other `UIViewController`s.

Definition at line 57 of file FlutterViewController.h.

## Method Documentation

## ◆ initWithCoder:

- (instancetype) initWithCoder: |  | (NSCoder*) | NS_DESIGNATED_INITIALIZER |

Initializer that is called from loading a FlutterViewController from a XIB.

See also: https://developer.apple.com/documentation/foundation/nscoding/1416145-initwithcoder?language=objc

Definition at line 169 of file FlutterViewController.mm.

247 :(NSCoder*)aDecoder {
248 self = [super initWithCoder:aDecoder];
249 return self;
250 }

## ◆ initWithEngine:nibName:bundle:

- (instancetype) initWithEngine: |  | (FlutterEngine*) | engine
nibName: |  | (nullable NSString*) | nibName
bundle: |  | (nullable NSBundle*) | NS_DESIGNATED_INITIALIZER

Initializes this FlutterViewController with the specified `FlutterEngine`.

The initialized viewcontroller will attach itself to the engine as part of this process.

Parameters

  engine | The `FlutterEngine` instance to attach to. Cannot be nil.
  nibName | The NIB name to initialize this UIViewController with.
  nibBundle | The NIB bundle.

Definition at line 169 of file FlutterViewController.mm.

183 :(FlutterEngine*)engine
184 nibName:(nullable NSString*)nibName
185 bundle:(nullable NSBundle*)nibBundle {
186 FML_CHECK(engine) << "initWithEngine:nibName:bundle: must be called with non-nil engine";
187 self = [super initWithNibName:nibName bundle:nibBundle];
188 if (self) {
189 _viewOpaque = YES;
190 if (engine.viewController) {
191 NSString* errorMessage =
192 [NSString stringWithFormat:
193 @"The supplied FlutterEngine %@ is already used with FlutterViewController "
194 "instance %@. One instance of the FlutterEngine can only be attached to "
195 "one FlutterViewController at a time. Set FlutterEngine.viewController to "
196 "nil before attaching it to another FlutterViewController.",
197 engine.description, engine.viewController.description];
198 [FlutterLogger logError:errorMessage];
199 }
200 _engine = engine;
201 _engineNeedsLaunch = NO;
202 _flutterView = [[FlutterView alloc] initWithDelegate:_engine
203 opaque:self.isViewOpaque
204 enableWideGamut:engine.project.isWideGamutEnabled];
205 _ongoingTouches = [[NSMutableSet alloc] init];
206
207 // TODO(cbracken): https://github.com/flutter/flutter/issues/157140
208 // Eliminate method calls in initializers and dealloc.
209 [self performCommonViewControllerInitialization];
210 [engine setViewController:self];
211 }
212
213 return self;
214 }
FlutterEngine
Definition: FlutterEngine.h:61
FlutterEngine::viewController
FlutterViewController * viewController
Definition: FlutterEngine.h:327
FlutterViewController::engine
FlutterEngine * engine
Definition: FlutterViewController.h:236
FlutterView
Definition: FlutterView.h:50

## ◆ initWithProject:initialRoute:nibName:bundle:

- (instancetype) initWithProject: |  | (nullable FlutterDartProject *) | project
initialRoute: |  | (nullable NSString *) | initialRoute
nibName: |  | (nullable NSString *) | nibName
bundle: |  | (nullable NSBundle *) | NS_DESIGNATED_INITIALIZER

Initializes a new FlutterViewController and `FlutterEngine` with the specified `FlutterDartProject` and `initialRoute`.

This will implicitly create a new `FlutterEngine` which is retrievable via the `engine` property after initialization.

Parameters

  project | The `FlutterDartProject` to initialize the `FlutterEngine` with.
  initialRoute | The initial `Navigator` route to load.
  nibName | The NIB name to initialize this UIViewController with.
  nibBundle | The NIB bundle.

## ◆ initWithProject:nibName:bundle:

- (instancetype) initWithProject: |  | (nullable FlutterDartProject *) | project
nibName: |  | (nullable NSString *) | nibName
bundle: |  | (nullable NSBundle *) | NS_DESIGNATED_INITIALIZER

Initializes a new FlutterViewController and `FlutterEngine` with the specified `FlutterDartProject`.

This will implicitly create a new `FlutterEngine` which is retrievable via the `engine` property after initialization.

Parameters

  project | The `FlutterDartProject` to initialize the `FlutterEngine` with.
  nibName | The NIB name to initialize this UIViewController with.
  nibBundle | The NIB bundle.

## ◆ isUIAccessibilityIsVoiceOverRunning

+ (BOOL) isUIAccessibilityIsVoiceOverRunning |  |  |

A wrapper around UIAccessibilityIsVoiceOverRunning().

As a C function, UIAccessibilityIsVoiceOverRunning() cannot be mocked in testing. Mock this class method to testing features depends on UIAccessibilityIsVoiceOverRunning().

Definition at line 1182 of file FlutterViewController.mm.

2510 {
2511 return UIAccessibilityIsVoiceOverRunning();
2512 }

## ◆ loadDefaultSplashScreenView

- (BOOL) loadDefaultSplashScreenView |  |  |

Attempts to set the `splashScreenView` property from the `UILaunchStoryboardName` from the main bundle's `Info.plist` file. This method will not change the value of `splashScreenView` if it cannot find a default one from a storyboard or nib.

Returns
  `YES` if successful, `NO` otherwise.

Definition at line 588 of file FlutterViewController.mm.

706 {
707 NSString* launchscreenName =
708 [[[NSBundle mainBundle] infoDictionary] objectForKey:@"UILaunchStoryboardName"];
709 if (launchscreenName == nil) {
710 return NO;
711 }
712 UIView* splashView = [self splashScreenFromStoryboard:launchscreenName];
713 if (!splashView) {
714 splashView = [self splashScreenFromXib:launchscreenName];
715 }
716 if (!splashView) {
717 return NO;
718 }
719 self.splashScreenView = splashView;
720 return YES;
721 }

References FlutterEngine::viewController.

## ◆ lookupKeyForAsset:

- (NSString *) lookupKeyForAsset: |  | (NSString*) | asset |

Returns the file name for the given asset. The returned file name can be used to access the asset in the application's main bundle.

Parameters

  asset | The name of the asset. The name can be hierarchical.

Returns
  The file name to be used for lookup in the main bundle.

Definition at line 1182 of file FlutterViewController.mm.

2498 :(NSString*)asset {
2499 return [FlutterDartProject lookupKeyForAsset:asset];
2500 }
FlutterDartProject
Definition: FlutterDartProject.mm:268
+[FlutterDartProject lookupKeyForAsset:]
NSString * lookupKeyForAsset:(NSString *asset)
Definition: FlutterDartProject.mm:394

## ◆ lookupKeyForAsset:fromPackage:

- (NSString *) lookupKeyForAsset: |  | (NSString*) | asset
fromPackage: |  | (NSString*) | package

Returns the file name for the given asset which originates from the specified package. The returned file name can be used to access the asset in the application's main bundle.

Parameters

  asset | The name of the asset. The name can be hierarchical.
  package | The name of the package from which the asset originates.

Returns
  The file name to be used for lookup in the main bundle.

Definition at line 1182 of file FlutterViewController.mm.

2502 :(NSString*)asset fromPackage:(NSString*)package {
2503 return [FlutterDartProject lookupKeyForAsset:asset fromPackage:package];
2504 }

## ◆ pluginRegistry

- (id< FlutterPluginRegistry >) pluginRegistry |  |  |

The `FlutterPluginRegistry` used by this FlutterViewController.

Definition at line 1182 of file FlutterViewController.mm.

2506 {
2507 return self.engine;
2508 }

## ◆ popRoute

- (void) popRoute |  |  |

Instructs the Flutter Navigator (if any) to go back.

Definition at line 169 of file FlutterViewController.mm.

515 {
516 [self.engine.navigationChannel invokeMethod:@"popRoute" arguments:nil];
517 }

## ◆ pushRoute:

- (void) pushRoute: |  | (NSString*) | route |

Instructs the Flutter Navigator (if any) to push a route on to the navigation stack.

Parameters

  route | The name of the route to push to the navigation stack.

Definition at line 169 of file FlutterViewController.mm.

519 :(NSString*)route {
520 [self.engine.navigationChannel invokeMethod:@"pushRoute" arguments:route];
521 }

## ◆ setFlutterViewDidRenderCallback:

- (void) setFlutterViewDidRenderCallback: |  | (void(^)(void)) | callback |

Registers a callback that will be invoked when the Flutter view has been rendered. The callback will be fired only once.

Replaces an existing callback. Use a `nil` callback to unregister the existing one.

Definition at line 588 of file FlutterViewController.mm.

769 :(void (^)(void))callback {
770 _flutterViewRenderedCallback = callback;
771 }

## ◆ setInitialRoute:

- (void) setInitialRoute: |  | ("Use FlutterViewController initializer to specify initial route") | FLUTTER_DEPRECATED |

Deprecated API to set initial route.

Attempts to set the first route that the Flutter app shows if the Flutter runtime hasn't yet started. The default is "/".

This method must be called immediately after `initWithProject` and has no effect when using `initWithEngine` if the `FlutterEngine` has already been run.

Setting this after the Flutter started running has no effect. See `pushRoute` and `popRoute` to change the route after Flutter started running.

This is deprecated because it needs to be called at the time of initialization and thus should just be in the `initWithProject` initializer. If using `initWithEngine`, the initial route should be set on the engine's initializer.

Parameters

  route | The name of the first route to show.

## Property Documentation

## ◆ autoResizable

- (BOOL) autoResizable
| read write nonatomic assign

Controls whether the created view can be sized based on its content. When set to `YES`, the FlutterView will be the same size as the outermost widget. Cannot be used with unbounded height widgets, such as Scaffold. This property is intended to be used with Add-to-App scenarios.

Once auto resizing is enabled, the FlutterView will rely on custom constraints from then on. Avoid disabling it after enabling, as behaviour will then be undefined.

Default is `NO`.

Definition at line 268 of file FlutterViewController.h.

## ◆ binaryMessenger

- (NSObject< FlutterBinaryMessenger > *) binaryMessenger
| read nonatomic assign

The `FlutterBinaryMessenger` associated with this FlutterViewController (used for communicating with channels).

This is just a convenient way to get the |FlutterEngine|'s binary messenger.

Definition at line 244 of file FlutterViewController.h.

## ◆ displayingFlutterUI

- (BOOL) displayingFlutterUI
| read nonatomic assign

True if at least one frame has rendered and the ViewController has appeared.

This property is reset to false when the ViewController disappears. It is guaranteed to only alternate between true and false for observers.

Definition at line 198 of file FlutterViewController.h.

## ◆ engine

- (FlutterEngine*) engine
| read nonatomic assign

The `FlutterEngine` instance for this view controller. This could be the engine this `FlutterViewController` is initialized with or a new `FlutterEngine` implicitly created if no engine was supplied during initialization.

Definition at line 236 of file FlutterViewController.h.

## ◆ engineAllowHeadlessExecution

- (BOOL) engineAllowHeadlessExecution
| read nonatomic assign

If the `FlutterViewController` creates a `FlutterEngine`, this property determines if that `FlutterEngine` has `allowHeadlessExecution` set.

The intention is that this is used with the XIB. Otherwise, a `FlutterEngine` can just be sent to the init methods.

See also: `-[FlutterEngine initWithName:project:allowHeadlessExecution:]`

Definition at line 255 of file FlutterViewController.h.

## ◆ splashScreenView

- (UIView*) splashScreenView
| read write nonatomic strong

Specifies the view to use as a splash screen. Flutter's rendering is asynchronous, so the first frame rendered by the Flutter application might not immediately appear when the Flutter view is initially placed in the view hierarchy. The splash screen view will be used as a replacement until the first frame is rendered.

The view used should be appropriate for multiple sizes; an autoresizing mask to have a flexible width and height will be applied automatically.

Set to nil to remove the splash screen view.

Definition at line 211 of file FlutterViewController.h.

## ◆ viewOpaque

- (BOOL) viewOpaque
| read write nonatomic assign

Controls whether the created view will be opaque or not.

Default is `YES`. Note that setting this to `NO` may negatively impact performance when using hardware acceleration, and toggling this will trigger a re-layout of the view.

Definition at line 229 of file FlutterViewController.h.

The documentation for this class was generated from the following files:

- shell/platform/darwin/ios/framework/Headers/FlutterViewController.h
- shell/platform/darwin/ios/framework/Source/FlutterViewController.mm