| Flutter iOS Embedder |

Classes | Public Member Functions | List of all members
flutter::PlatformViewIOS Class Referencefinal

`#include <platform_view_ios.h>`

Inheritance diagram for flutter::PlatformViewIOS:

## Public Member Functions
| PlatformViewIOS (PlatformView::Delegate &delegate, const std::shared_ptr< IOSContext > &context, __weak FlutterPlatformViewsController *platform_views_controller, const flutter::TaskRunners &task_runners)
| PlatformViewIOS (PlatformView::Delegate &delegate, IOSRenderingAPI rendering_api, __weak FlutterPlatformViewsController *platform_views_controller, const flutter::TaskRunners &task_runners, const std::shared_ptr< fml::ConcurrentTaskRunner > &worker_task_runner, const std::shared_ptr< const fml::SyncSwitch > &is_gpu_disabled_sync_switch)
| ~PlatformViewIOS () override
FlutterViewController * | GetOwnerViewController () const __attribute__((cf_audited_transfer))
void | SetOwnerViewController (__weak FlutterViewController *owner_controller)
void | attachView ()
void | RegisterExternalTexture (int64_t id, NSObject< FlutterTexture > *texture)
PointerDataDispatcherMaker | GetDispatcherMaker () override
void | SetSemanticsEnabled (bool enabled) override
void | SetSemanticsTreeEnabled (bool enabled) override
void | HandlePlatformMessage (std::unique_ptr< flutter::PlatformMessage > message) override
std::unique_ptr< Surface > | CreateRenderingSurface () override
std::shared_ptr< ExternalViewEmbedder > | CreateExternalViewEmbedder () override
std::shared_ptr< impeller::Context > | GetImpellerContext () const override
void | SetAccessibilityFeatures (int32_t flags) override
void | UpdateSemantics (int64_t view_id, flutter::SemanticsNodeUpdates update, flutter::CustomAccessibilityActionUpdates actions) override
void | SetApplicationLocale (std::string locale) override
std::unique_ptr< VsyncWaiter > | CreateVSyncWaiter () override
void | OnPreEngineRestart () const override
std::unique_ptr< std::vector< std::string > > | ComputePlatformResolvedLocales (const std::vector< std::string > &supported_locale_data) override
const std::shared_ptr< IOSContext > & | GetIosContext ()
std::shared_ptr< PlatformMessageHandlerIos > | GetPlatformMessageHandlerIos () const
std::shared_ptr< PlatformMessageHandler > | GetPlatformMessageHandler () const override
AccessibilityBridge * | GetAccessibilityBridge ()

## Detailed Description

A bridge connecting the platform agnostic shell and the iOS embedding.

The shell provides and requests for UI related data and this PlatformView subclass fulfills it with iOS specific capabilities. As an example, the iOS embedding (the `FlutterEngine` and the `FlutterViewController`) sends pointer data to the shell and receives the shell's request for a Impeller AiksContext and supplies it.

Despite the name "view", this class is unrelated to UIViews on iOS and doesn't have the same lifecycle. It's a long lived bridge owned by the `FlutterEngine` and can be attached and detached sequentially to multiple `FlutterViewController`s and `FlutterView`s.

Definition at line 40 of file platform_view_ios.h.

## Constructor & Destructor Documentation

## ◆ PlatformViewIOS() [1/2]

flutter::PlatformViewIOS::PlatformViewIOS | ( | PlatformView::Delegate & | delegate,
|  | const std::shared_ptr< IOSContext > & | context,
|  | __weak FlutterPlatformViewsController * | platform_views_controller,
|  | const flutter::TaskRunners & | task_runners
| ) |  |

Definition at line 22 of file platform_view_ios.mm.

26 : PlatformView(delegate, task_runners),
27 ios_context_(context),
28 platform_views_controller_(platform_views_controller),
29 platform_message_handler_(
30 new PlatformMessageHandlerIos(task_runners.GetPlatformTaskRunner())) {}

## ◆ PlatformViewIOS() [2/2]

flutter::PlatformViewIOS::PlatformViewIOS | ( | PlatformView::Delegate & | delegate,
|  | IOSRenderingAPI | rendering_api,
|  | __weak FlutterPlatformViewsController * | platform_views_controller,
|  | const flutter::TaskRunners & | task_runners,
|  | const std::shared_ptr< fml::ConcurrentTaskRunner > & | worker_task_runner,
|  | const std::shared_ptr< const fml::SyncSwitch > & | is_gpu_disabled_sync_switch
| ) |  |
| explicit

Definition at line 32 of file platform_view_ios.mm.

39 : PlatformViewIOS(delegate,
40 IOSContext::Create(rendering_api,
41 delegate.OnPlatformViewGetSettings().enable_impeller
42 ? IOSRenderingBackend::kImpeller
43 : IOSRenderingBackend::kSkia,
44 is_gpu_disabled_sync_switch,
45 delegate.OnPlatformViewGetSettings()),
46 platform_views_controller,
47 task_runners) {}
flutter::IOSContext::Create
static std::unique_ptr< IOSContext > Create(IOSRenderingAPI api, IOSRenderingBackend backend, const std::shared_ptr< const fml::SyncSwitch > &is_gpu_disabled_sync_switch, const Settings &settings)
Create an iOS context object capable of creating the on-screen and off-screen GPU context for use by ...
Definition: ios_context.mm:23
flutter::PlatformViewIOS::PlatformViewIOS
PlatformViewIOS(PlatformView::Delegate &delegate, const std::shared_ptr< IOSContext > &context, __weak FlutterPlatformViewsController *platform_views_controller, const flutter::TaskRunners &task_runners)
Definition: platform_view_ios.mm:22
flutter::IOSRenderingBackend::kImpeller
@ kImpeller
flutter::IOSRenderingBackend::kSkia
@ kSkia

References flutter::kImpeller, and flutter::kSkia.

## ◆ ~PlatformViewIOS()

flutter::PlatformViewIOS::~PlatformViewIOS | ( |  | ) |
| override default

## Member Function Documentation

## ◆ attachView()

void flutter::PlatformViewIOS::attachView | ( |  | ) |

Called one time per `FlutterViewController` when the `FlutterViewController`'s UIView is first loaded.

Can be used to perform late initialization after `FlutterViewController`'s init.

Definition at line 91 of file platform_view_ios.mm.

91 {
92 FML_DCHECK(owner_controller_);
93 FML_DCHECK(owner_controller_.isViewLoaded) << "FlutterViewController's view should be loaded "
94 "before attaching to PlatformViewIOS.";
95 FlutterView* flutter_view = static_cast<FlutterView*>(owner_controller_.view);
96 CALayer* ca_layer = flutter_view.layer;
97 ios_surface_ = IOSSurface::Create(ios_context_, ca_layer);
98 FML_DCHECK(ios_surface_ != nullptr);
99
100 if (accessibility_bridge_) {
101 accessibility_bridge_ = std::make_unique<AccessibilityBridge>(
102 owner_controller_, this, owner_controller_.platformViewsController);
103 }
104 }
flutter::IOSSurface::Create
static std::unique_ptr< IOSSurface > Create(std::shared_ptr< IOSContext > context, CALayer *layer)
Definition: ios_surface.mm:18
FlutterView
Definition: FlutterView.h:33

References flutter::IOSSurface::Create().

Referenced by SetOwnerViewController().

## ◆ ComputePlatformResolvedLocales()

std::unique_ptr< std::vector< std::string > > flutter::PlatformViewIOS::ComputePlatformResolvedLocales | ( | const std::vector< std::string > & | supported_locale_data | ) |
| override

Definition at line 199 of file platform_view_ios.mm.

200 {
201 size_t localeDataLength = 3;
202 NSMutableArray<NSString*>* supported_locale_identifiers =
203 [NSMutableArray arrayWithCapacity:supported_locale_data.size() / localeDataLength];
204 for (size_t i = 0; i < supported_locale_data.size(); i += localeDataLength) {
205 NSDictionary<NSString*, NSString*>* dict = @{
206 NSLocaleLanguageCode : [NSString stringWithUTF8String:supported_locale_data[i].c_str()]
207 ?: @"",
208 NSLocaleCountryCode : [NSString stringWithUTF8String:supported_locale_data[i + 1].c_str()]
209 ?: @"",
210 NSLocaleScriptCode : [NSString stringWithUTF8String:supported_locale_data[i + 2].c_str()]
211 ?: @""
212 };
213 [supported_locale_identifiers addObject:[NSLocale localeIdentifierFromComponents:dict]];
214 }
215 NSArray<NSString*>* result =
216 [NSBundle preferredLocalizationsFromArray:supported_locale_identifiers];
217
218 // Output format should be either empty or 3 strings for language, country, and script.
219 std::unique_ptr<std::vector<std::string>> out = std::make_unique<std::vector<std::string>>();
220
221 if (result != nullptr && [result count] > 0) {
222 NSLocale* locale = [NSLocale localeWithLocaleIdentifier:[result firstObject]];
223 NSString* languageCode = [locale languageCode];
224 out->emplace_back(languageCode == nullptr ? "" : languageCode.UTF8String);
225 NSString* countryCode = [locale countryCode];
226 out->emplace_back(countryCode == nullptr ? "" : countryCode.UTF8String);
227 NSString* scriptCode = [locale scriptCode];
228 out->emplace_back(scriptCode == nullptr ? "" : scriptCode.UTF8String);
229 }
230 return out;
231 }

## ◆ CreateExternalViewEmbedder()

std::shared_ptr< ExternalViewEmbedder > flutter::PlatformViewIOS::CreateExternalViewEmbedder | ( |  | ) |
| override

Definition at line 130 of file platform_view_ios.mm.

130 {
131 return std::make_shared<IOSExternalViewEmbedder>(platform_views_controller_, ios_context_);
132 }

## ◆ CreateRenderingSurface()

std::unique_ptr< Surface > flutter::PlatformViewIOS::CreateRenderingSurface | ( |  | ) |
| override

Definition at line 118 of file platform_view_ios.mm.

118 {
119 FML_DCHECK(task_runners_.GetRasterTaskRunner()->RunsTasksOnCurrentThread());
120 std::lock_guard<std::mutex> guard(ios_surface_mutex_);
121 if (!ios_surface_) {
122 FML_DLOG(INFO) << "Could not CreateRenderingSurface, this PlatformViewIOS "
123 "has no ViewController.";
124 return nullptr;
125 }
126 return ios_surface_->CreateGPUSurface();
127 }

## ◆ CreateVSyncWaiter()

std::unique_ptr< VsyncWaiter > flutter::PlatformViewIOS::CreateVSyncWaiter | ( |  | ) |
| override

Definition at line 183 of file platform_view_ios.mm.

183 {
184 return std::make_unique<VsyncWaiterIOS>(task_runners_);
185 }

## ◆ GetAccessibilityBridge()

AccessibilityBridge* flutter::PlatformViewIOS::GetAccessibilityBridge | ( |  | ) |
| inline

Gets the accessibility bridge created in this platform view.

Definition at line 141 of file platform_view_ios.h.

141 { return accessibility_bridge_.get(); }

## ◆ GetDispatcherMaker()

PointerDataDispatcherMaker flutter::PlatformViewIOS::GetDispatcherMaker | ( |  | ) |
| override

Definition at line 106 of file platform_view_ios.mm.

106 {
107 return [](DefaultPointerDataDispatcher::Delegate& delegate) {
108 return std::make_unique<SmoothPointerDataDispatcher>(delegate);
109 };
110 }

## ◆ GetImpellerContext()

std::shared_ptr< impeller::Context > flutter::PlatformViewIOS::GetImpellerContext | ( |  | ) | const
| override

Definition at line 135 of file platform_view_ios.mm.

135 {
136 return ios_context_->GetImpellerContext();
137 }

## ◆ GetIosContext()

const std::shared_ptr<IOSContext>& flutter::PlatformViewIOS::GetIosContext | ( |  | ) |
| inline

Accessor for the `IOSContext` associated with the platform view.

Definition at line 128 of file platform_view_ios.h.

128 { return ios_context_; }

## ◆ GetOwnerViewController()

FlutterViewController * flutter::PlatformViewIOS::GetOwnerViewController | ( |  | ) | const

Returns the `FlutterViewController` currently attached to the `FlutterEngine` owning this PlatformViewIOS.

Definition at line 56 of file platform_view_ios.mm.

56 {
57 return owner_controller_;
58 }

## ◆ GetPlatformMessageHandler()

std::shared_ptr<PlatformMessageHandler> flutter::PlatformViewIOS::GetPlatformMessageHandler | ( |  | ) | const
| inline override

Definition at line 134 of file platform_view_ios.h.

134 {
135 return platform_message_handler_;
136 }

## ◆ GetPlatformMessageHandlerIos()

std::shared_ptr<PlatformMessageHandlerIos> flutter::PlatformViewIOS::GetPlatformMessageHandlerIos | ( |  | ) | const
| inline

Definition at line 130 of file platform_view_ios.h.

130 {
131 return platform_message_handler_;
132 }

## ◆ HandlePlatformMessage()

void flutter::PlatformViewIOS::HandlePlatformMessage | ( | std::unique_ptr< flutter::PlatformMessage > | message | ) |
| override

Definition at line 52 of file platform_view_ios.mm.

52 {
53 platform_message_handler_->HandlePlatformMessage(std::move(message));
54 }

## ◆ OnPreEngineRestart()

void flutter::PlatformViewIOS::OnPreEngineRestart | ( |  | ) | const
| override

Definition at line 187 of file platform_view_ios.mm.

187 {
188 if (accessibility_bridge_) {
189 accessibility_bridge_.get()->clearState();
190 }
191 if (!owner_controller_) {
192 return;
193 }
194 [owner_controller_.platformViewsController reset];
195 [owner_controller_.restorationPlugin reset];
196 [owner_controller_.textInputPlugin reset];
197 }

## ◆ RegisterExternalTexture()

void flutter::PlatformViewIOS::RegisterExternalTexture | ( | int64_t | id,
|  | NSObject< FlutterTexture > * | texture
| ) |  |

Called through when an external texture such as video or camera is given to the `FlutterEngine` or `FlutterViewController`.

Definition at line 112 of file platform_view_ios.mm.

113 {
114 RegisterTexture(ios_context_->CreateExternalTexture(texture_id, texture));
115 }
texture_id
int64_t texture_id
Definition: texture_registrar_unittests.cc:24

References texture_id.

## ◆ SetAccessibilityFeatures()

void flutter::PlatformViewIOS::SetAccessibilityFeatures | ( | int32_t | flags | ) |
| override

Definition at line 145 of file platform_view_ios.mm.

145 {
146 PlatformView::SetAccessibilityFeatures(flags);
147 }

## ◆ SetApplicationLocale()

void flutter::PlatformViewIOS::SetApplicationLocale | ( | std::string | locale | ) |
| override

Definition at line 163 of file platform_view_ios.mm.

163 {
164 FML_DCHECK(owner_controller_);
165 owner_controller_.applicationLocale = locale.empty() ? nil : @(locale.data());
166 }

## ◆ SetOwnerViewController()

void flutter::PlatformViewIOS::SetOwnerViewController | ( | __weak FlutterViewController * | owner_controller | ) |

Updates the `FlutterViewController` currently attached to the `FlutterEngine` owning this PlatformViewIOS. This should be updated when the `FlutterEngine` is given a new `FlutterViewController`.

Definition at line 60 of file platform_view_ios.mm.

60 {
61 FML_DCHECK(task_runners_.GetPlatformTaskRunner()->RunsTasksOnCurrentThread());
62 std::lock_guard<std::mutex> guard(ios_surface_mutex_);
63 if (ios_surface_ || !owner_controller) {
64 NotifyDestroyed();
65 ios_surface_.reset();
66 accessibility_bridge_.reset();
67 }
68 owner_controller_ = owner_controller;
69
70 // Add an observer that will clear out the owner_controller_ ivar and
71 // the accessibility_bridge_ in case the view controller is deleted.
72 dealloc_view_controller_observer_.reset([[NSNotificationCenter defaultCenter]
73 addObserverForName:FlutterViewControllerWillDealloc
74 object:owner_controller_
75 queue:[NSOperationQueue mainQueue]
76 usingBlock:^(NSNotification* note) {
77 // Implicit copy of 'this' is fine.
78 accessibility_bridge_.reset();
79 owner_controller_ = nil;
80 }]);
81
82 if (owner_controller_ && owner_controller_.isViewLoaded) {
83 this->attachView();
84 }
85 // Do not call `NotifyCreated()` here - let FlutterViewController take care
86 // of that when its Viewport is sized. If `NotifyCreated()` is called here,
87 // it can occasionally get invoked before the viewport is sized resulting in
88 // a framebuffer that will not be able to completely attach.
89 }
FlutterViewControllerWillDealloc
NSNotificationName const FlutterViewControllerWillDealloc
Definition: FlutterViewController.mm:49
flutter::PlatformViewIOS::attachView
void attachView()
Definition: platform_view_ios.mm:91

References attachView(), and FlutterViewControllerWillDealloc.

## ◆ SetSemanticsEnabled()

void flutter::PlatformViewIOS::SetSemanticsEnabled | ( | bool | enabled | ) |
| override

Definition at line 140 of file platform_view_ios.mm.

140 {
141 PlatformView::SetSemanticsEnabled(enabled);
142 }

## ◆ SetSemanticsTreeEnabled()

void flutter::PlatformViewIOS::SetSemanticsTreeEnabled | ( | bool | enabled | ) |
| override

Definition at line 169 of file platform_view_ios.mm.

169 {
170 FML_DCHECK(owner_controller_);
171 if (enabled) {
172 if (accessibility_bridge_) {
173 return;
174 }
175 accessibility_bridge_ =
176 std::make_unique<AccessibilityBridge>(owner_controller_, this, platform_views_controller_);
177 } else {
178 accessibility_bridge_.reset();
179 }
180 }

## ◆ UpdateSemantics()

void flutter::PlatformViewIOS::UpdateSemantics | ( | int64_t | view_id,
|  | flutter::SemanticsNodeUpdates | update,
|  | flutter::CustomAccessibilityActionUpdates | actions
| ) |  |
| override

Definition at line 150 of file platform_view_ios.mm.

152 {
153 FML_DCHECK(owner_controller_);
154 FML_DCHECK(accessibility_bridge_);
155 if (accessibility_bridge_) {
156 accessibility_bridge_.get()->UpdateSemantics(std::move(update), actions);
157 [[NSNotificationCenter defaultCenter] postNotificationName:FlutterSemanticsUpdateNotification
158 object:owner_controller_];
159 }
160 }
FlutterSemanticsUpdateNotification
FLUTTER_DARWIN_EXPORT NSNotificationName const FlutterSemanticsUpdateNotification
Definition: FlutterViewController.mm:48

References FlutterSemanticsUpdateNotification.

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

- shell/platform/darwin/ios/platform_view_ios.h
- shell/platform/darwin/ios/platform_view_ios.mm