Use GWeakRef API (#55795)

For consistency with other code.
diff --git a/shell/platform/linux/fl_key_channel_responder.cc b/shell/platform/linux/fl_key_channel_responder.cc
index e5213a7..fa19707 100644
--- a/shell/platform/linux/fl_key_channel_responder.cc
+++ b/shell/platform/linux/fl_key_channel_responder.cc
@@ -42,7 +42,7 @@
   GObject parent_instance;
 
   // The current responder.
-  FlKeyChannelResponder* responder;
+  GWeakRef responder;
   // The callback provided by the caller #FlKeyboardHandler.
   FlKeyResponderAsyncCallback callback;
   // The user_data provided by the caller #FlKeyboardHandler.
@@ -56,12 +56,8 @@
 static void fl_key_channel_user_data_dispose(GObject* object) {
   g_return_if_fail(FL_IS_KEY_CHANNEL_USER_DATA(object));
   FlKeyChannelUserData* self = FL_KEY_CHANNEL_USER_DATA(object);
-  if (self->responder != nullptr) {
-    g_object_remove_weak_pointer(
-        G_OBJECT(self->responder),
-        reinterpret_cast<gpointer*>(&(self->responder)));
-    self->responder = nullptr;
-  }
+
+  g_weak_ref_clear(&self->responder);
 
   G_OBJECT_CLASS(fl_key_channel_user_data_parent_class)->dispose(object);
 }
@@ -85,11 +81,7 @@
   FlKeyChannelUserData* self = FL_KEY_CHANNEL_USER_DATA(
       g_object_new(fl_key_channel_user_data_get_type(), nullptr));
 
-  self->responder = responder;
-  // Add a weak pointer so we can know if the key event responder disappeared
-  // while the framework was responding.
-  g_object_add_weak_pointer(G_OBJECT(responder),
-                            reinterpret_cast<gpointer*>(&(self->responder)));
+  g_weak_ref_init(&self->responder, responder);
   self->callback = callback;
   self->user_data = user_data;
   return self;
@@ -136,13 +128,12 @@
                             gpointer user_data) {
   g_autoptr(FlKeyChannelUserData) data = FL_KEY_CHANNEL_USER_DATA(user_data);
 
-  // This is true if the weak pointer has been destroyed.
-  if (data->responder == nullptr) {
+  g_autoptr(FlKeyChannelResponder) self =
+      FL_KEY_CHANNEL_RESPONDER(g_weak_ref_get(&data->responder));
+  if (self == nullptr) {
     return;
   }
 
-  FlKeyChannelResponder* self = data->responder;
-
   g_autoptr(GError) error = nullptr;
   FlBasicMessageChannel* messageChannel = FL_BASIC_MESSAGE_CHANNEL(object);
   FlValue* message =
diff --git a/shell/platform/linux/fl_keyboard_handler.cc b/shell/platform/linux/fl_keyboard_handler.cc
index 65673dc..f9c922a 100644
--- a/shell/platform/linux/fl_keyboard_handler.cc
+++ b/shell/platform/linux/fl_keyboard_handler.cc
@@ -85,8 +85,8 @@
 struct _FlKeyboardHandlerUserData {
   GObject parent_instance;
 
-  // A weak reference to the owner handler.
-  FlKeyboardHandler* handler;
+  // The owner handler.
+  GWeakRef handler;
   uint64_t sequence_id;
 };
 
@@ -97,11 +97,8 @@
 static void fl_keyboard_handler_user_data_dispose(GObject* object) {
   g_return_if_fail(FL_IS_KEYBOARD_HANDLER_USER_DATA(object));
   FlKeyboardHandlerUserData* self = FL_KEYBOARD_HANDLER_USER_DATA(object);
-  if (self->handler != nullptr) {
-    g_object_remove_weak_pointer(G_OBJECT(self->handler),
-                                 reinterpret_cast<gpointer*>(&(self->handler)));
-    self->handler = nullptr;
-  }
+
+  g_weak_ref_clear(&self->handler);
 
   G_OBJECT_CLASS(fl_keyboard_handler_user_data_parent_class)->dispose(object);
 }
@@ -121,11 +118,7 @@
   FlKeyboardHandlerUserData* self = FL_KEYBOARD_HANDLER_USER_DATA(
       g_object_new(fl_keyboard_handler_user_data_get_type(), nullptr));
 
-  self->handler = handler;
-  // Add a weak pointer so we can know if the key event responder disappeared
-  // while the framework was responding.
-  g_object_add_weak_pointer(G_OBJECT(handler),
-                            reinterpret_cast<gpointer*>(&(self->handler)));
+  g_weak_ref_init(&self->handler, handler);
   self->sequence_id = sequence_id;
   return self;
 }
@@ -135,7 +128,7 @@
 struct _FlKeyboardHandler {
   GObject parent_instance;
 
-  FlKeyboardViewDelegate* view_delegate;
+  GWeakRef view_delegate;
 
   // An array of #FlKeyResponder. Elements are added with
   // #fl_keyboard_handler_add_responder immediately after initialization and are
@@ -247,8 +240,18 @@
   g_return_if_fail(FL_IS_KEYBOARD_HANDLER_USER_DATA(user_data_ptr));
   FlKeyboardHandlerUserData* user_data =
       FL_KEYBOARD_HANDLER_USER_DATA(user_data_ptr);
-  FlKeyboardHandler* self = user_data->handler;
-  g_return_if_fail(self->view_delegate != nullptr);
+
+  g_autoptr(FlKeyboardHandler) self =
+      FL_KEYBOARD_HANDLER(g_weak_ref_get(&user_data->handler));
+  if (self == nullptr) {
+    return;
+  }
+
+  g_autoptr(FlKeyboardViewDelegate) view_delegate =
+      FL_KEYBOARD_VIEW_DELEGATE(g_weak_ref_get(&self->view_delegate));
+  if (view_delegate == nullptr) {
+    return;
+  }
 
   guint result_index = -1;
   gboolean found = g_ptr_array_find_with_equal_func1(
@@ -268,11 +271,11 @@
     bool should_redispatch =
         !fl_keyboard_pending_event_get_any_handled(pending) &&
         !fl_keyboard_view_delegate_text_filter_key_press(
-            self->view_delegate, fl_keyboard_pending_event_get_event(pending));
+            view_delegate, fl_keyboard_pending_event_get_event(pending));
     if (should_redispatch) {
       g_ptr_array_add(self->pending_redispatches, pending);
       fl_keyboard_view_delegate_redispatch_event(
-          self->view_delegate,
+          view_delegate,
           FL_KEY_EVENT(fl_keyboard_pending_event_get_event(pending)));
     } else {
       g_object_unref(pending);
@@ -293,6 +296,12 @@
 // Make sure that Flutter has derived the layout for the group of the event,
 // if the event contains a goal keycode.
 static void guarantee_layout(FlKeyboardHandler* self, FlKeyEvent* event) {
+  g_autoptr(FlKeyboardViewDelegate) view_delegate =
+      FL_KEYBOARD_VIEW_DELEGATE(g_weak_ref_get(&self->view_delegate));
+  if (view_delegate == nullptr) {
+    return;
+  }
+
   guint8 group = fl_key_event_get_group(event);
   if (fl_keyboard_layout_has_group(self->derived_layout, group)) {
     return;
@@ -311,8 +320,8 @@
   std::string debug_layout_data;
   for (uint16_t keycode = 0; keycode < 128; keycode += 1) {
     std::vector<uint16_t> this_key_clues = {
-        convert_key_to_char(self->view_delegate, keycode, group, 0),
-        convert_key_to_char(self->view_delegate, keycode, group, 1),  // Shift
+        convert_key_to_char(view_delegate, keycode, group, 0),
+        convert_key_to_char(view_delegate, keycode, group, 1),  // Shift
     };
     debug_format_layout_data(debug_layout_data, keycode, this_key_clues[0],
                              this_key_clues[1]);
@@ -326,8 +335,8 @@
   for (const LayoutGoal& keycode_goal : layout_goals) {
     uint16_t keycode = keycode_goal.keycode;
     std::vector<uint16_t> this_key_clues = {
-        convert_key_to_char(self->view_delegate, keycode, group, 0),
-        convert_key_to_char(self->view_delegate, keycode, group, 1),  // Shift
+        convert_key_to_char(view_delegate, keycode, group, 0),
+        convert_key_to_char(view_delegate, keycode, group, 1),  // Shift
     };
 
     // The logical key should be the first available clue from below:
@@ -376,8 +385,11 @@
 static FlMethodResponse* get_keyboard_state(FlKeyboardHandler* self) {
   g_autoptr(FlValue) result = fl_value_new_map();
 
+  g_autoptr(FlKeyboardViewDelegate) view_delegate =
+      FL_KEYBOARD_VIEW_DELEGATE(g_weak_ref_get(&self->view_delegate));
+
   GHashTable* pressing_records =
-      fl_keyboard_view_delegate_get_keyboard_state(self->view_delegate);
+      fl_keyboard_view_delegate_get_keyboard_state(view_delegate);
 
   g_hash_table_foreach(
       pressing_records,
@@ -428,12 +440,7 @@
 static void fl_keyboard_handler_dispose(GObject* object) {
   FlKeyboardHandler* self = FL_KEYBOARD_HANDLER(object);
 
-  if (self->view_delegate != nullptr) {
-    g_object_remove_weak_pointer(
-        G_OBJECT(self->view_delegate),
-        reinterpret_cast<gpointer*>(&(self->view_delegate)));
-    self->view_delegate = nullptr;
-  }
+  g_weak_ref_clear(&self->view_delegate);
 
   self->keycode_to_goals.reset();
   self->logical_to_mandatory_goals.reset();
@@ -481,10 +488,7 @@
   FlKeyboardHandler* self = FL_KEYBOARD_HANDLER(
       g_object_new(fl_keyboard_handler_get_type(), nullptr));
 
-  self->view_delegate = view_delegate;
-  g_object_add_weak_pointer(
-      G_OBJECT(view_delegate),
-      reinterpret_cast<gpointer*>(&(self->view_delegate)));
+  g_weak_ref_init(&self->view_delegate, view_delegate);
 
   // The embedder responder must be added before the channel responder.
   g_ptr_array_add(
@@ -494,9 +498,13 @@
              void* callback_user_data, void* send_key_event_user_data) {
             FlKeyboardHandler* self =
                 FL_KEYBOARD_HANDLER(send_key_event_user_data);
-            g_return_if_fail(self->view_delegate != nullptr);
+            g_autoptr(FlKeyboardViewDelegate) view_delegate =
+                FL_KEYBOARD_VIEW_DELEGATE(g_weak_ref_get(&self->view_delegate));
+            if (view_delegate == nullptr) {
+              return;
+            }
             fl_keyboard_view_delegate_send_key_event(
-                self->view_delegate, event, callback, callback_user_data);
+                view_delegate, event, callback, callback_user_data);
           },
           self)));
   g_ptr_array_add(self->responder_list,
@@ -516,7 +524,6 @@
                                           FlKeyEvent* event) {
   g_return_val_if_fail(FL_IS_KEYBOARD_HANDLER(self), FALSE);
   g_return_val_if_fail(event != nullptr, FALSE);
-  g_return_val_if_fail(self->view_delegate != nullptr, FALSE);
 
   guarantee_layout(self, event);
 
diff --git a/shell/platform/linux/fl_mouse_cursor_handler.cc b/shell/platform/linux/fl_mouse_cursor_handler.cc
index 107a8d6..d8fdc8c 100644
--- a/shell/platform/linux/fl_mouse_cursor_handler.cc
+++ b/shell/platform/linux/fl_mouse_cursor_handler.cc
@@ -22,7 +22,7 @@
 
   FlMethodChannel* channel;
 
-  FlView* view;
+  GWeakRef view;
 
   GHashTable* system_cursor_table;
 };
@@ -109,11 +109,14 @@
     cursor_name = kFallbackCursor;
   }
 
-  GdkWindow* window =
-      gtk_widget_get_window(gtk_widget_get_toplevel(GTK_WIDGET(self->view)));
-  g_autoptr(GdkCursor) cursor =
-      gdk_cursor_new_from_name(gdk_window_get_display(window), cursor_name);
-  gdk_window_set_cursor(window, cursor);
+  g_autoptr(FlView) view = FL_VIEW(g_weak_ref_get(&self->view));
+  if (view != nullptr) {
+    GdkWindow* window =
+        gtk_widget_get_window(gtk_widget_get_toplevel(GTK_WIDGET(view)));
+    g_autoptr(GdkCursor) cursor =
+        gdk_cursor_new_from_name(gdk_window_get_display(window), cursor_name);
+    gdk_window_set_cursor(window, cursor);
+  }
 
   return FL_METHOD_RESPONSE(fl_method_success_response_new(nullptr));
 }
@@ -144,11 +147,7 @@
   FlMouseCursorHandler* self = FL_MOUSE_CURSOR_HANDLER(object);
 
   g_clear_object(&self->channel);
-  if (self->view != nullptr) {
-    g_object_remove_weak_pointer(G_OBJECT(self->view),
-                                 reinterpret_cast<gpointer*>(&(self->view)));
-    self->view = nullptr;
-  }
+  g_weak_ref_clear(&self->view);
   g_clear_pointer(&self->system_cursor_table, g_hash_table_unref);
 
   G_OBJECT_CLASS(fl_mouse_cursor_handler_parent_class)->dispose(object);
@@ -173,11 +172,7 @@
       fl_method_channel_new(messenger, kChannelName, FL_METHOD_CODEC(codec));
   fl_method_channel_set_method_call_handler(self->channel, method_call_cb, self,
                                             nullptr);
-  self->view = view;
-  if (view != nullptr) {
-    g_object_add_weak_pointer(G_OBJECT(view),
-                              reinterpret_cast<gpointer*>(&(self->view)));
-  }
+  g_weak_ref_init(&self->view, view);
 
   return self;
 }
diff --git a/shell/platform/linux/fl_plugin_registrar.cc b/shell/platform/linux/fl_plugin_registrar.cc
index 403af32..46b8ad7 100644
--- a/shell/platform/linux/fl_plugin_registrar.cc
+++ b/shell/platform/linux/fl_plugin_registrar.cc
@@ -17,7 +17,7 @@
   GObject parent_instance;
 
   // View that plugin is controlling.
-  FlView* view;
+  GWeakRef view;
 
   // Messenger to communicate on.
   FlBinaryMessenger* messenger;
@@ -44,11 +44,7 @@
 static void fl_plugin_registrar_impl_dispose(GObject* object) {
   FlPluginRegistrarImpl* self = FL_PLUGIN_REGISTRAR_IMPL(object);
 
-  if (self->view != nullptr) {
-    g_object_remove_weak_pointer(G_OBJECT(self->view),
-                                 reinterpret_cast<gpointer*>(&(self->view)));
-    self->view = nullptr;
-  }
+  g_weak_ref_clear(&self->view);
   g_clear_object(&self->messenger);
   g_clear_object(&self->texture_registrar);
 
@@ -72,7 +68,8 @@
 
 static FlView* get_view(FlPluginRegistrar* registrar) {
   FlPluginRegistrarImpl* self = FL_PLUGIN_REGISTRAR_IMPL(registrar);
-  return self->view;
+  g_autoptr(FlView) view = FL_VIEW(g_weak_ref_get(&self->view));
+  return view;
 }
 
 static void fl_plugin_registrar_impl_iface_init(
@@ -98,11 +95,7 @@
   // Added to stop compiler complaining about an unused function.
   FL_IS_PLUGIN_REGISTRAR_IMPL(self);
 
-  self->view = view;
-  if (view != nullptr) {
-    g_object_add_weak_pointer(G_OBJECT(view),
-                              reinterpret_cast<gpointer*>(&(self->view)));
-  }
+  g_weak_ref_init(&self->view, view);
   self->messenger = FL_BINARY_MESSENGER(g_object_ref(messenger));
   self->texture_registrar =
       FL_TEXTURE_REGISTRAR(g_object_ref(texture_registrar));
diff --git a/shell/platform/linux/fl_scrolling_manager.cc b/shell/platform/linux/fl_scrolling_manager.cc
index 81b4fc5..7bfe1a2 100644
--- a/shell/platform/linux/fl_scrolling_manager.cc
+++ b/shell/platform/linux/fl_scrolling_manager.cc
@@ -9,7 +9,7 @@
 struct _FlScrollingManager {
   GObject parent_instance;
 
-  FlScrollingViewDelegate* view_delegate;
+  GWeakRef view_delegate;
 
   gdouble last_x;
   gdouble last_y;
@@ -29,11 +29,7 @@
 static void fl_scrolling_manager_dispose(GObject* object) {
   FlScrollingManager* self = FL_SCROLLING_MANAGER(object);
 
-  if (self->view_delegate != nullptr) {
-    g_object_remove_weak_pointer(
-        object, reinterpret_cast<gpointer*>(&self->view_delegate));
-    self->view_delegate = nullptr;
-  }
+  g_weak_ref_clear(&self->view_delegate);
 
   G_OBJECT_CLASS(fl_scrolling_manager_parent_class)->dispose(object);
 }
@@ -51,11 +47,7 @@
   FlScrollingManager* self = FL_SCROLLING_MANAGER(
       g_object_new(fl_scrolling_manager_get_type(), nullptr));
 
-  self->view_delegate = view_delegate;
-  g_object_add_weak_pointer(
-      G_OBJECT(view_delegate),
-      reinterpret_cast<gpointer*>(&(self->view_delegate)));
-
+  g_weak_ref_init(&self->view_delegate, view_delegate);
   self->pan_started = FALSE;
   self->zoom_started = FALSE;
   self->rotate_started = FALSE;
@@ -76,6 +68,12 @@
                                               gint scale_factor) {
   g_return_if_fail(FL_IS_SCROLLING_MANAGER(self));
 
+  g_autoptr(FlScrollingViewDelegate) view_delegate =
+      FL_SCROLLING_VIEW_DELEGATE(g_weak_ref_get(&self->view_delegate));
+  if (view_delegate == nullptr) {
+    return;
+  }
+
   GdkEvent* event = reinterpret_cast<GdkEvent*>(scroll_event);
 
   guint event_time = gdk_event_get_time(event);
@@ -113,7 +111,7 @@
     scroll_delta_y *= -1;
     if (gdk_event_is_scroll_stop_event(event)) {
       fl_scrolling_view_delegate_send_pointer_pan_zoom_event(
-          self->view_delegate, event_time * kMicrosecondsPerMillisecond,
+          view_delegate, event_time * kMicrosecondsPerMillisecond,
           event_x * scale_factor, event_y * scale_factor, kPanZoomEnd,
           self->pan_x, self->pan_y, 0, 0);
       self->pan_started = FALSE;
@@ -122,7 +120,7 @@
         self->pan_x = 0;
         self->pan_y = 0;
         fl_scrolling_view_delegate_send_pointer_pan_zoom_event(
-            self->view_delegate, event_time * kMicrosecondsPerMillisecond,
+            view_delegate, event_time * kMicrosecondsPerMillisecond,
             event_x * scale_factor, event_y * scale_factor, kPanZoomStart, 0, 0,
             0, 0);
         self->pan_started = TRUE;
@@ -130,7 +128,7 @@
       self->pan_x += scroll_delta_x;
       self->pan_y += scroll_delta_y;
       fl_scrolling_view_delegate_send_pointer_pan_zoom_event(
-          self->view_delegate, event_time * kMicrosecondsPerMillisecond,
+          view_delegate, event_time * kMicrosecondsPerMillisecond,
           event_x * scale_factor, event_y * scale_factor, kPanZoomUpdate,
           self->pan_x, self->pan_y, 1, 0);
     }
@@ -138,7 +136,7 @@
     self->last_x = event_x * scale_factor;
     self->last_y = event_y * scale_factor;
     fl_scrolling_view_delegate_send_mouse_pointer_event(
-        self->view_delegate,
+        view_delegate,
         FlutterPointerPhase::kMove /* arbitrary value, phase will be ignored as
                                       this is a discrete scroll event */
         ,
@@ -151,12 +149,18 @@
 void fl_scrolling_manager_handle_rotation_begin(FlScrollingManager* self) {
   g_return_if_fail(FL_IS_SCROLLING_MANAGER(self));
 
+  g_autoptr(FlScrollingViewDelegate) view_delegate =
+      FL_SCROLLING_VIEW_DELEGATE(g_weak_ref_get(&self->view_delegate));
+  if (view_delegate == nullptr) {
+    return;
+  }
+
   self->rotate_started = TRUE;
   if (!self->zoom_started) {
     self->scale = 1;
     self->rotation = 0;
     fl_scrolling_view_delegate_send_pointer_pan_zoom_event(
-        self->view_delegate, g_get_real_time(), self->last_x, self->last_y,
+        view_delegate, g_get_real_time(), self->last_x, self->last_y,
         kPanZoomStart, 0, 0, 0, 0);
   }
 }
@@ -165,19 +169,31 @@
                                                  gdouble rotation) {
   g_return_if_fail(FL_IS_SCROLLING_MANAGER(self));
 
+  g_autoptr(FlScrollingViewDelegate) view_delegate =
+      FL_SCROLLING_VIEW_DELEGATE(g_weak_ref_get(&self->view_delegate));
+  if (view_delegate == nullptr) {
+    return;
+  }
+
   self->rotation = rotation;
   fl_scrolling_view_delegate_send_pointer_pan_zoom_event(
-      self->view_delegate, g_get_real_time(), self->last_x, self->last_y,
+      view_delegate, g_get_real_time(), self->last_x, self->last_y,
       kPanZoomUpdate, 0, 0, self->scale, self->rotation);
 }
 
 void fl_scrolling_manager_handle_rotation_end(FlScrollingManager* self) {
   g_return_if_fail(FL_IS_SCROLLING_MANAGER(self));
 
+  g_autoptr(FlScrollingViewDelegate) view_delegate =
+      FL_SCROLLING_VIEW_DELEGATE(g_weak_ref_get(&self->view_delegate));
+  if (view_delegate == nullptr) {
+    return;
+  }
+
   self->rotate_started = FALSE;
   if (!self->zoom_started) {
     fl_scrolling_view_delegate_send_pointer_pan_zoom_event(
-        self->view_delegate, g_get_real_time(), self->last_x, self->last_y,
+        view_delegate, g_get_real_time(), self->last_x, self->last_y,
         kPanZoomEnd, 0, 0, 0, 0);
   }
 }
@@ -185,12 +201,18 @@
 void fl_scrolling_manager_handle_zoom_begin(FlScrollingManager* self) {
   g_return_if_fail(FL_IS_SCROLLING_MANAGER(self));
 
+  g_autoptr(FlScrollingViewDelegate) view_delegate =
+      FL_SCROLLING_VIEW_DELEGATE(g_weak_ref_get(&self->view_delegate));
+  if (view_delegate == nullptr) {
+    return;
+  }
+
   self->zoom_started = TRUE;
   if (!self->rotate_started) {
     self->scale = 1;
     self->rotation = 0;
     fl_scrolling_view_delegate_send_pointer_pan_zoom_event(
-        self->view_delegate, g_get_real_time(), self->last_x, self->last_y,
+        view_delegate, g_get_real_time(), self->last_x, self->last_y,
         kPanZoomStart, 0, 0, 0, 0);
   }
 }
@@ -199,19 +221,31 @@
                                              gdouble scale) {
   g_return_if_fail(FL_IS_SCROLLING_MANAGER(self));
 
+  g_autoptr(FlScrollingViewDelegate) view_delegate =
+      FL_SCROLLING_VIEW_DELEGATE(g_weak_ref_get(&self->view_delegate));
+  if (view_delegate == nullptr) {
+    return;
+  }
+
   self->scale = scale;
   fl_scrolling_view_delegate_send_pointer_pan_zoom_event(
-      self->view_delegate, g_get_real_time(), self->last_x, self->last_y,
+      view_delegate, g_get_real_time(), self->last_x, self->last_y,
       kPanZoomUpdate, 0, 0, self->scale, self->rotation);
 }
 
 void fl_scrolling_manager_handle_zoom_end(FlScrollingManager* self) {
   g_return_if_fail(FL_IS_SCROLLING_MANAGER(self));
 
+  g_autoptr(FlScrollingViewDelegate) view_delegate =
+      FL_SCROLLING_VIEW_DELEGATE(g_weak_ref_get(&self->view_delegate));
+  if (view_delegate == nullptr) {
+    return;
+  }
+
   self->zoom_started = FALSE;
   if (!self->rotate_started) {
     fl_scrolling_view_delegate_send_pointer_pan_zoom_event(
-        self->view_delegate, g_get_real_time(), self->last_x, self->last_y,
+        view_delegate, g_get_real_time(), self->last_x, self->last_y,
         kPanZoomEnd, 0, 0, 0, 0);
   }
 }
diff --git a/shell/platform/linux/fl_settings_handler.cc b/shell/platform/linux/fl_settings_handler.cc
index 6ad6322..a62044b 100644
--- a/shell/platform/linux/fl_settings_handler.cc
+++ b/shell/platform/linux/fl_settings_handler.cc
@@ -23,7 +23,7 @@
   GObject parent_instance;
 
   FlBasicMessageChannel* channel;
-  FlEngine* engine;
+  GWeakRef engine;
   FlSettings* settings;
 };
 
@@ -58,7 +58,8 @@
   fl_basic_message_channel_send(self->channel, message, nullptr, nullptr,
                                 nullptr);
 
-  if (self->engine != nullptr) {
+  g_autoptr(FlEngine) engine = FL_ENGINE(g_weak_ref_get(&self->engine));
+  if (engine != nullptr) {
     int32_t flags = 0;
     if (!fl_settings_get_enable_animations(self->settings)) {
       flags |= kFlutterAccessibilityFeatureDisableAnimations;
@@ -66,7 +67,7 @@
     if (fl_settings_get_high_contrast(self->settings)) {
       flags |= kFlutterAccessibilityFeatureHighContrast;
     }
-    fl_engine_update_accessibility_features(self->engine, flags);
+    fl_engine_update_accessibility_features(engine, flags);
   }
 }
 
@@ -75,12 +76,7 @@
 
   g_clear_object(&self->channel);
   g_clear_object(&self->settings);
-
-  if (self->engine != nullptr) {
-    g_object_remove_weak_pointer(G_OBJECT(self),
-                                 reinterpret_cast<gpointer*>(&(self->engine)));
-    self->engine = nullptr;
-  }
+  g_weak_ref_clear(&self->engine);
 
   G_OBJECT_CLASS(fl_settings_handler_parent_class)->dispose(object);
 }
@@ -97,9 +93,7 @@
   FlSettingsHandler* self = FL_SETTINGS_HANDLER(
       g_object_new(fl_settings_handler_get_type(), nullptr));
 
-  self->engine = engine;
-  g_object_add_weak_pointer(G_OBJECT(self),
-                            reinterpret_cast<gpointer*>(&(self->engine)));
+  g_weak_ref_init(&self->engine, engine);
 
   FlBinaryMessenger* messenger = fl_engine_get_binary_messenger(engine);
   g_autoptr(FlJsonMessageCodec) codec = fl_json_message_codec_new();
diff --git a/shell/platform/linux/fl_text_input_handler.cc b/shell/platform/linux/fl_text_input_handler.cc
index f4d3eb7..d9a8c08 100644
--- a/shell/platform/linux/fl_text_input_handler.cc
+++ b/shell/platform/linux/fl_text_input_handler.cc
@@ -82,7 +82,7 @@
   // Input method.
   GtkIMContext* im_context;
 
-  FlTextInputViewDelegate* view_delegate;
+  GWeakRef view_delegate;
 
   flutter::TextInputModel* text_model;
 
@@ -485,6 +485,12 @@
   FlTextInputHandlerPrivate* priv = static_cast<FlTextInputHandlerPrivate*>(
       fl_text_input_handler_get_instance_private(self));
 
+  g_autoptr(FlTextInputViewDelegate) view_delegate =
+      FL_TEXT_INPUT_VIEW_DELEGATE(g_weak_ref_get(&priv->view_delegate));
+  if (view_delegate == nullptr) {
+    return;
+  }
+
   // Skip update if not composing to avoid setting to position 0.
   if (!priv->text_model->composing()) {
     return;
@@ -502,7 +508,7 @@
   // Transform from Flutter view coordinates to GTK window coordinates.
   GdkRectangle preedit_rect = {};
   fl_text_input_view_delegate_translate_coordinates(
-      priv->view_delegate, x, y, &preedit_rect.x, &preedit_rect.y);
+      view_delegate, x, y, &preedit_rect.x, &preedit_rect.y);
 
   // Set the cursor location in window coordinates so that GTK can position any
   // system input method windows.
@@ -603,12 +609,7 @@
     delete priv->text_model;
     priv->text_model = nullptr;
   }
-  if (priv->view_delegate != nullptr) {
-    g_object_remove_weak_pointer(
-        G_OBJECT(priv->view_delegate),
-        reinterpret_cast<gpointer*>(&(priv->view_delegate)));
-    priv->view_delegate = nullptr;
-  }
+  g_weak_ref_clear(&priv->view_delegate);
 
   G_OBJECT_CLASS(fl_text_input_handler_parent_class)->dispose(object);
 }
@@ -765,10 +766,7 @@
 
   init_im_context(self, im_context);
 
-  priv->view_delegate = view_delegate;
-  g_object_add_weak_pointer(
-      G_OBJECT(view_delegate),
-      reinterpret_cast<gpointer*>(&(priv->view_delegate)));
+  g_weak_ref_init(&priv->view_delegate, view_delegate);
 
   return self;
 }
diff --git a/shell/platform/linux/fl_view_accessible.cc b/shell/platform/linux/fl_view_accessible.cc
index d8e3b74..09bb839 100644
--- a/shell/platform/linux/fl_view_accessible.cc
+++ b/shell/platform/linux/fl_view_accessible.cc
@@ -13,7 +13,7 @@
 struct _FlViewAccessible {
   AtkPlug parent_instance;
 
-  FlEngine* engine;
+  GWeakRef engine;
 
   // Semantics nodes keyed by ID
   GHashTable* semantics_nodes_by_id;
@@ -28,11 +28,16 @@
 
 static FlAccessibleNode* create_node(FlViewAccessible* self,
                                      FlutterSemanticsNode2* semantics) {
-  if (semantics->flags & kFlutterSemanticsFlagIsTextField) {
-    return fl_accessible_text_field_new(self->engine, semantics->id);
+  g_autoptr(FlEngine) engine = FL_ENGINE(g_weak_ref_get(&self->engine));
+  if (engine == nullptr) {
+    return nullptr;
   }
 
-  return fl_accessible_node_new(self->engine, semantics->id);
+  if (semantics->flags & kFlutterSemanticsFlagIsTextField) {
+    return fl_accessible_text_field_new(engine, semantics->id);
+  }
+
+  return fl_accessible_node_new(engine, semantics->id);
 }
 
 static FlAccessibleNode* lookup_node(FlViewAccessible* self, int32_t id) {
@@ -107,11 +112,7 @@
 
   g_clear_pointer(&self->semantics_nodes_by_id, g_hash_table_unref);
 
-  if (self->engine != nullptr) {
-    g_object_remove_weak_pointer(object,
-                                 reinterpret_cast<gpointer*>(&self->engine));
-    self->engine = nullptr;
-  }
+  g_weak_ref_clear(&self->engine);
 
   G_OBJECT_CLASS(fl_view_accessible_parent_class)->dispose(object);
 }
@@ -133,9 +134,7 @@
 FlViewAccessible* fl_view_accessible_new(FlEngine* engine) {
   FlViewAccessible* self =
       FL_VIEW_ACCESSIBLE(g_object_new(fl_view_accessible_get_type(), nullptr));
-  self->engine = engine;
-  g_object_add_weak_pointer(G_OBJECT(self),
-                            reinterpret_cast<gpointer*>(&self->engine));
+  g_weak_ref_init(&self->engine, engine);
   return self;
 }