Flutter iOS Embedder
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
 
FlutterViewControllerGetOwnerViewController () 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< PlatformMessageHandlerIosGetPlatformMessageHandlerIos () const
 
std::shared_ptr< PlatformMessageHandler > GetPlatformMessageHandler () const override
 
AccessibilityBridgeGetAccessibilityBridge ()
 

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 FlutterViewControllers and FlutterViews.

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
44  is_gpu_disabled_sync_switch,
45  delegate.OnPlatformViewGetSettings()),
46  platform_views_controller,
47  task_runners) {}
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
PlatformViewIOS(PlatformView::Delegate &delegate, const std::shared_ptr< IOSContext > &context, __weak FlutterPlatformViewsController *platform_views_controller, const flutter::TaskRunners &task_runners)

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

◆ ~PlatformViewIOS()

flutter::PlatformViewIOS::~PlatformViewIOS ( )
overridedefault

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 }
static std::unique_ptr< IOSSurface > Create(std::shared_ptr< IOSContext > context, CALayer *layer)
Definition: ios_surface.mm:18

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
inlineoverride

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 }
int64_t texture_id

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 }
NSNotificationName const FlutterViewControllerWillDealloc

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 }
FLUTTER_DARWIN_EXPORT NSNotificationName const FlutterSemanticsUpdateNotification

References FlutterSemanticsUpdateNotification.


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