123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220 |
- // 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.
- #ifndef FLUTTER_FLUTTERVIEWCONTROLLER_H_
- #define FLUTTER_FLUTTERVIEWCONTROLLER_H_
- #import <UIKit/UIKit.h>
- #include <sys/cdefs.h>
- #include "FlutterBinaryMessenger.h"
- #include "FlutterDartProject.h"
- #include "FlutterEngine.h"
- #include "FlutterMacros.h"
- #include "FlutterPlugin.h"
- #include "FlutterTexture.h"
- NS_ASSUME_NONNULL_BEGIN
- @class FlutterEngine;
- /**
- * The name used for semantic update notifications via `NSNotificationCenter`.
- *
- * The object passed as the sender is the `FlutterViewController` associated
- * with the update.
- */
- FLUTTER_EXPORT
- extern NSNotificationName const FlutterSemanticsUpdateNotification;
- /**
- * 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://flutter.dev/docs/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.
- */
- FLUTTER_EXPORT
- @interface FlutterViewController : UIViewController <FlutterTextureRegistry, FlutterPluginRegistry>
- /**
- * Initializes this FlutterViewController with the specified `FlutterEngine`.
- *
- * The initialized viewcontroller will attach itself to the engine as part of this process.
- *
- * @param engine The `FlutterEngine` instance to attach to.
- * @param nibName The NIB name to initialize this UIViewController with.
- * @param nibBundle The NIB bundle.
- */
- - (instancetype)initWithEngine:(FlutterEngine*)engine
- nibName:(nullable NSString*)nibName
- bundle:(nullable NSBundle*)nibBundle 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.
- *
- * @param project The `FlutterDartProject` to initialize the `FlutterEngine` with.
- * @param nibName The NIB name to initialize this UIViewController with.
- * @param nibBundle The NIB bundle.
- */
- - (instancetype)initWithProject:(nullable FlutterDartProject*)project
- nibName:(nullable NSString*)nibName
- bundle:(nullable NSBundle*)nibBundle 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
- */
- - (instancetype)initWithCoder:(NSCoder*)aDecoder NS_DESIGNATED_INITIALIZER;
- /**
- * 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.
- */
- - (void)setFlutterViewDidRenderCallback:(void (^)(void))callback;
- /**
- * 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.
- *
- * @param asset The name of the asset. The name can be hierarchical.
- * @return The file name to be used for lookup in the main bundle.
- */
- - (NSString*)lookupKeyForAsset:(NSString*)asset;
- /**
- * 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.
- *
- * @param asset The name of the asset. The name can be hierarchical.
- * @param package The name of the package from which the asset originates.
- * @return The file name to be used for lookup in the main bundle.
- */
- - (NSString*)lookupKeyForAsset:(NSString*)asset fromPackage:(NSString*)package;
- /**
- * 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.
- *
- * @param route The name of the first route to show.
- */
- - (void)setInitialRoute:(NSString*)route;
- /**
- * Instructs the Flutter Navigator (if any) to go back.
- */
- - (void)popRoute;
- /**
- * Instructs the Flutter Navigator (if any) to push a route on to the navigation
- * stack. The setInitialRoute method should be preferred if this is called before the
- * FlutterViewController has come into view.
- *
- * @param route The name of the route to push to the navigation stack.
- */
- - (void)pushRoute:(NSString*)route;
- /**
- * The `FlutterPluginRegistry` used by this FlutterViewController.
- */
- - (id<FlutterPluginRegistry>)pluginRegistry;
- /**
- * 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.
- */
- @property(nonatomic, readonly, getter=isDisplayingFlutterUI) BOOL displayingFlutterUI;
- /**
- * 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 theFlutter 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.
- */
- @property(strong, nonatomic) UIView* splashScreenView;
- /**
- * 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.
- *
- * @return `YES` if successful, `NO` otherwise.
- */
- - (BOOL)loadDefaultSplashScreenView;
- /**
- * 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.
- */
- @property(nonatomic, getter=isViewOpaque) BOOL viewOpaque;
- /**
- * 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.
- */
- @property(weak, nonatomic, readonly) FlutterEngine* engine;
- /**
- * The `FlutterBinaryMessenger` associated with this FlutterViewController (used for communicating
- * with channels).
- *
- * This is just a convenient way to get the |FlutterEngine|'s binary messenger.
- */
- @property(nonatomic, readonly) NSObject<FlutterBinaryMessenger>* binaryMessenger;
- /**
- * 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:]`
- */
- @property(nonatomic, readonly) BOOL engineAllowHeadlessExecution;
- @end
- NS_ASSUME_NONNULL_END
- #endif // FLUTTER_FLUTTERVIEWCONTROLLER_H_
|