From 938e16547070db2ad8b9de7174b4daf8fa314cb3 Mon Sep 17 00:00:00 2001 From: fufesou <13586388+fufesou@users.noreply.github.com> Date: Fri, 24 Oct 2025 17:20:56 +0800 Subject: [PATCH] fix: save frame, LateInitializationError (#13265) Signed-off-by: fufesou --- flutter/lib/common.dart | 33 +++++++++++-------- .../lib/desktop/widgets/tabbar_widget.dart | 13 +++++--- flutter/lib/utils/multi_window_manager.dart | 6 +++- 3 files changed, 34 insertions(+), 18 deletions(-) diff --git a/flutter/lib/common.dart b/flutter/lib/common.dart index d4982c9dd..1fb9c2599 100644 --- a/flutter/lib/common.dart +++ b/flutter/lib/common.dart @@ -1736,22 +1736,29 @@ final Debouncer _saveWindowDebounce = Debouncer(delay: Duration(seconds: 1)); /// Save window position and size on exit /// Note that windowId must be provided if it's subwindow -Future saveWindowPosition(WindowType type, {int? windowId, bool? flush}) async { +Future saveWindowPosition(WindowType type, + {int? windowId, bool? flush}) async { if (type != WindowType.Main && windowId == null) { debugPrint( "Error: windowId cannot be null when saving positions for sub window"); } - late Offset position; - late Size sz; + Offset? position; + Size? sz; late bool isMaximized; bool isFullscreen = stateGlobal.fullscreen.isTrue; + setPreFrame() { final pos = bind.getLocalFlutterOption(k: windowFramePrefix + type.name); var lpos = LastWindowPosition.loadFromString(pos); - position = Offset( - lpos?.offsetWidth ?? position.dx, lpos?.offsetHeight ?? position.dy); - sz = Size(lpos?.width ?? sz.width, lpos?.height ?? sz.height); + if (lpos != null) { + if (lpos.offsetWidth != null && lpos.offsetHeight != null) { + position = Offset(lpos.offsetWidth!, lpos.offsetHeight!); + } + if (lpos.width != null && lpos.height != null) { + sz = Size(lpos.width!, lpos.height!); + } + } } switch (type) { @@ -1791,20 +1798,20 @@ Future saveWindowPosition(WindowType type, {int? windowId, bool? flush}) a } break; } - if (isWindows) { + if (isWindows && position != null) { const kMinOffset = -10000; const kMaxOffset = 10000; - if (position.dx < kMinOffset || - position.dy < kMinOffset || - position.dx > kMaxOffset || - position.dy > kMaxOffset) { + if (position!.dx < kMinOffset || + position!.dy < kMinOffset || + position!.dx > kMaxOffset || + position!.dy > kMaxOffset) { debugPrint("Invalid position: $position, ignore saving position"); return; } } - final pos = LastWindowPosition( - sz.width, sz.height, position.dx, position.dy, isMaximized, isFullscreen); + final pos = LastWindowPosition(sz?.width, sz?.height, position?.dx, + position?.dy, isMaximized, isFullscreen); final WindowKey key = (type: type, windowId: windowId); diff --git a/flutter/lib/desktop/widgets/tabbar_widget.dart b/flutter/lib/desktop/widgets/tabbar_widget.dart index 6e7c02d2a..cf601557a 100644 --- a/flutter/lib/desktop/widgets/tabbar_widget.dart +++ b/flutter/lib/desktop/widgets/tabbar_widget.dart @@ -405,10 +405,15 @@ class _DesktopTabState extends State } _saveFrame({bool? flush}) async { - if (tabType == DesktopTabType.main) { - await saveWindowPosition(WindowType.Main, flush: flush); - } else if (kWindowType != null && kWindowId != null) { - await saveWindowPosition(kWindowType!, windowId: kWindowId, flush: flush); + try { + if (tabType == DesktopTabType.main) { + await saveWindowPosition(WindowType.Main, flush: flush); + } else if (kWindowType != null && kWindowId != null) { + await saveWindowPosition(kWindowType!, + windowId: kWindowId, flush: flush); + } + } catch (e) { + debugPrint('Error saving window position: $e'); } } diff --git a/flutter/lib/utils/multi_window_manager.dart b/flutter/lib/utils/multi_window_manager.dart index 3bbb292f4..9e26f8cf9 100644 --- a/flutter/lib/utils/multi_window_manager.dart +++ b/flutter/lib/utils/multi_window_manager.dart @@ -475,7 +475,11 @@ class RustDeskMultiWindowManager { final shouldSavePos = type != WindowType.Terminal || i == windows.length - 1; if (shouldSavePos) { debugPrint("closing multi window, type: ${type.toString()} id: $wId"); - await saveWindowPosition(type, windowId: wId); + try { + await saveWindowPosition(type, windowId: wId); + } catch (e) { + debugPrint('Failed to save window position of $wId, $e'); + } } try { await WindowController.fromWindowId(wId).setPreventClose(false);