cache closures from hooks.dart (#23230)

diff --git a/lib/ui/window/platform_configuration.cc b/lib/ui/window/platform_configuration.cc
index e8ff227..ccf9cc8 100644
--- a/lib/ui/window/platform_configuration.cc
+++ b/lib/ui/window/platform_configuration.cc
@@ -196,80 +196,109 @@
 PlatformConfiguration::~PlatformConfiguration() {}
 
 void PlatformConfiguration::DidCreateIsolate() {
-  library_.Set(tonic::DartState::Current(),
-               Dart_LookupLibrary(tonic::ToDart("dart:ui")));
+  Dart_Handle library = Dart_LookupLibrary(tonic::ToDart("dart:ui"));
+  update_locales_.Set(tonic::DartState::Current(),
+                      Dart_GetField(library, tonic::ToDart("_updateLocales")));
+  update_user_settings_data_.Set(
+      tonic::DartState::Current(),
+      Dart_GetField(library, tonic::ToDart("_updateUserSettingsData")));
+  update_lifecycle_state_.Set(
+      tonic::DartState::Current(),
+      Dart_GetField(library, tonic::ToDart("_updateLifecycleState")));
+  update_semantics_enabled_.Set(
+      tonic::DartState::Current(),
+      Dart_GetField(library, tonic::ToDart("_updateSemanticsEnabled")));
+  update_accessibility_features_.Set(
+      tonic::DartState::Current(),
+      Dart_GetField(library, tonic::ToDart("_updateAccessibilityFeatures")));
+  dispatch_platform_message_.Set(
+      tonic::DartState::Current(),
+      Dart_GetField(library, tonic::ToDart("_dispatchPlatformMessage")));
+  dispatch_semantics_action_.Set(
+      tonic::DartState::Current(),
+      Dart_GetField(library, tonic::ToDart("_dispatchSemanticsAction")));
+  begin_frame_.Set(tonic::DartState::Current(),
+                   Dart_GetField(library, tonic::ToDart("_beginFrame")));
+  draw_frame_.Set(tonic::DartState::Current(),
+                  Dart_GetField(library, tonic::ToDart("_drawFrame")));
+  report_timings_.Set(tonic::DartState::Current(),
+                      Dart_GetField(library, tonic::ToDart("_reportTimings")));
   windows_.insert(std::make_pair(0, std::unique_ptr<Window>(new Window{
                                         0, ViewportMetrics{1.0, 0.0, 0.0}})));
 }
 
 void PlatformConfiguration::UpdateLocales(
     const std::vector<std::string>& locales) {
-  std::shared_ptr<tonic::DartState> dart_state = library_.dart_state().lock();
+  std::shared_ptr<tonic::DartState> dart_state =
+      update_locales_.dart_state().lock();
   if (!dart_state) {
     return;
   }
+
   tonic::DartState::Scope scope(dart_state);
-  tonic::LogIfError(tonic::DartInvokeField(
-      library_.value(), "_updateLocales",
-      {
-          tonic::ToDart<std::vector<std::string>>(locales),
-      }));
+  tonic::LogIfError(
+      tonic::DartInvoke(update_locales_.Get(),
+                        {
+                            tonic::ToDart<std::vector<std::string>>(locales),
+                        }));
 }
 
 void PlatformConfiguration::UpdateUserSettingsData(const std::string& data) {
-  std::shared_ptr<tonic::DartState> dart_state = library_.dart_state().lock();
+  std::shared_ptr<tonic::DartState> dart_state =
+      update_user_settings_data_.dart_state().lock();
   if (!dart_state) {
     return;
   }
   tonic::DartState::Scope scope(dart_state);
 
-  tonic::LogIfError(tonic::DartInvokeField(library_.value(),
-                                           "_updateUserSettingsData",
-                                           {
-                                               tonic::StdStringToDart(data),
-                                           }));
+  tonic::LogIfError(tonic::DartInvoke(update_user_settings_data_.Get(),
+                                      {
+                                          tonic::StdStringToDart(data),
+                                      }));
 }
 
 void PlatformConfiguration::UpdateLifecycleState(const std::string& data) {
-  std::shared_ptr<tonic::DartState> dart_state = library_.dart_state().lock();
+  std::shared_ptr<tonic::DartState> dart_state =
+      update_lifecycle_state_.dart_state().lock();
   if (!dart_state) {
     return;
   }
   tonic::DartState::Scope scope(dart_state);
-  tonic::LogIfError(tonic::DartInvokeField(library_.value(),
-                                           "_updateLifecycleState",
-                                           {
-                                               tonic::StdStringToDart(data),
-                                           }));
+  tonic::LogIfError(tonic::DartInvoke(update_lifecycle_state_.Get(),
+                                      {
+                                          tonic::StdStringToDart(data),
+                                      }));
 }
 
 void PlatformConfiguration::UpdateSemanticsEnabled(bool enabled) {
-  std::shared_ptr<tonic::DartState> dart_state = library_.dart_state().lock();
+  std::shared_ptr<tonic::DartState> dart_state =
+      update_semantics_enabled_.dart_state().lock();
   if (!dart_state) {
     return;
   }
   tonic::DartState::Scope scope(dart_state);
   UIDartState::ThrowIfUIOperationsProhibited();
 
-  tonic::LogIfError(tonic::DartInvokeField(
-      library_.value(), "_updateSemanticsEnabled", {tonic::ToDart(enabled)}));
+  tonic::LogIfError(tonic::DartInvoke(update_semantics_enabled_.Get(),
+                                      {tonic::ToDart(enabled)}));
 }
 
 void PlatformConfiguration::UpdateAccessibilityFeatures(int32_t values) {
-  std::shared_ptr<tonic::DartState> dart_state = library_.dart_state().lock();
+  std::shared_ptr<tonic::DartState> dart_state =
+      update_accessibility_features_.dart_state().lock();
   if (!dart_state) {
     return;
   }
   tonic::DartState::Scope scope(dart_state);
 
-  tonic::LogIfError(tonic::DartInvokeField(library_.value(),
-                                           "_updateAccessibilityFeatures",
-                                           {tonic::ToDart(values)}));
+  tonic::LogIfError(tonic::DartInvoke(update_accessibility_features_.Get(),
+                                      {tonic::ToDart(values)}));
 }
 
 void PlatformConfiguration::DispatchPlatformMessage(
     fml::RefPtr<PlatformMessage> message) {
-  std::shared_ptr<tonic::DartState> dart_state = library_.dart_state().lock();
+  std::shared_ptr<tonic::DartState> dart_state =
+      dispatch_platform_message_.dart_state().lock();
   if (!dart_state) {
     FML_DLOG(WARNING)
         << "Dropping platform message for lack of DartState on channel: "
@@ -293,15 +322,16 @@
   }
 
   tonic::LogIfError(
-      tonic::DartInvokeField(library_.value(), "_dispatchPlatformMessage",
-                             {tonic::ToDart(message->channel()), data_handle,
-                              tonic::ToDart(response_id)}));
+      tonic::DartInvoke(dispatch_platform_message_.Get(),
+                        {tonic::ToDart(message->channel()), data_handle,
+                         tonic::ToDart(response_id)}));
 }
 
 void PlatformConfiguration::DispatchSemanticsAction(int32_t id,
                                                     SemanticsAction action,
                                                     std::vector<uint8_t> args) {
-  std::shared_ptr<tonic::DartState> dart_state = library_.dart_state().lock();
+  std::shared_ptr<tonic::DartState> dart_state =
+      dispatch_semantics_action_.dart_state().lock();
   if (!dart_state) {
     return;
   }
@@ -313,14 +343,15 @@
     return;
   }
 
-  tonic::LogIfError(tonic::DartInvokeField(
-      library_.value(), "_dispatchSemanticsAction",
+  tonic::LogIfError(tonic::DartInvoke(
+      dispatch_semantics_action_.Get(),
       {tonic::ToDart(id), tonic::ToDart(static_cast<int32_t>(action)),
        args_handle}));
 }
 
 void PlatformConfiguration::BeginFrame(fml::TimePoint frameTime) {
-  std::shared_ptr<tonic::DartState> dart_state = library_.dart_state().lock();
+  std::shared_ptr<tonic::DartState> dart_state =
+      begin_frame_.dart_state().lock();
   if (!dart_state) {
     return;
   }
@@ -328,18 +359,19 @@
 
   int64_t microseconds = (frameTime - fml::TimePoint()).ToMicroseconds();
 
-  tonic::LogIfError(tonic::DartInvokeField(library_.value(), "_beginFrame",
-                                           {
-                                               Dart_NewInteger(microseconds),
-                                           }));
+  tonic::LogIfError(
+      tonic::DartInvoke(begin_frame_.Get(), {
+                                                Dart_NewInteger(microseconds),
+                                            }));
 
   UIDartState::Current()->FlushMicrotasksNow();
 
-  tonic::LogIfError(tonic::DartInvokeField(library_.value(), "_drawFrame", {}));
+  tonic::LogIfError(tonic::DartInvokeVoid(draw_frame_.Get()));
 }
 
 void PlatformConfiguration::ReportTimings(std::vector<int64_t> timings) {
-  std::shared_ptr<tonic::DartState> dart_state = library_.dart_state().lock();
+  std::shared_ptr<tonic::DartState> dart_state =
+      report_timings_.dart_state().lock();
   if (!dart_state) {
     return;
   }
@@ -358,10 +390,9 @@
   memcpy(data, timings.data(), sizeof(int64_t) * timings.size());
   FML_CHECK(Dart_TypedDataReleaseData(data_handle));
 
-  tonic::LogIfError(tonic::DartInvokeField(library_.value(), "_reportTimings",
-                                           {
-                                               data_handle,
-                                           }));
+  tonic::LogIfError(tonic::DartInvoke(report_timings_.Get(), {
+                                                                 data_handle,
+                                                             }));
 }
 
 void PlatformConfiguration::CompletePlatformMessageEmptyResponse(
diff --git a/lib/ui/window/platform_configuration.h b/lib/ui/window/platform_configuration.h
index 2a43fcc..f61d474 100644
--- a/lib/ui/window/platform_configuration.h
+++ b/lib/ui/window/platform_configuration.h
@@ -325,8 +325,7 @@
 
   //----------------------------------------------------------------------------
   /// @brief      Notifies the framework that it is time to begin working on a
-  /// new
-  ///             frame previously scheduled via a call to
+  ///             new frame previously scheduled via a call to
   ///             `PlatformConfigurationClient::ScheduleFrame`. This call
   ///             originates in the animator.
   ///
@@ -414,7 +413,16 @@
 
  private:
   PlatformConfigurationClient* client_;
-  tonic::DartPersistentValue library_;
+  tonic::DartPersistentValue update_locales_;
+  tonic::DartPersistentValue update_user_settings_data_;
+  tonic::DartPersistentValue update_lifecycle_state_;
+  tonic::DartPersistentValue update_semantics_enabled_;
+  tonic::DartPersistentValue update_accessibility_features_;
+  tonic::DartPersistentValue dispatch_platform_message_;
+  tonic::DartPersistentValue dispatch_semantics_action_;
+  tonic::DartPersistentValue begin_frame_;
+  tonic::DartPersistentValue draw_frame_;
+  tonic::DartPersistentValue report_timings_;
 
   std::unordered_map<int64_t, std::unique_ptr<Window>> windows_;