From 60f47cb54931d030b3f2d1c9918262db79a1cc13 Mon Sep 17 00:00:00 2001 From: fufesou <13586388+fufesou@users.noreply.github.com> Date: Thu, 13 Jun 2024 21:04:00 +0800 Subject: [PATCH] fix: desktop, remote toolbar autohide (#8347) Signed-off-by: fufesou --- flutter/lib/desktop/pages/remote_page.dart | 18 +++++++++++++++--- .../lib/desktop/widgets/remote_toolbar.dart | 9 ++++----- 2 files changed, 19 insertions(+), 8 deletions(-) diff --git a/flutter/lib/desktop/pages/remote_page.dart b/flutter/lib/desktop/pages/remote_page.dart index 5e3d15130..6503fe108 100644 --- a/flutter/lib/desktop/pages/remote_page.dart +++ b/flutter/lib/desktop/pages/remote_page.dart @@ -85,6 +85,9 @@ class _RemotePageState extends State final FocusNode _rawKeyFocusNode = FocusNode(debugLabel: "rawkeyFocusNode"); + // We need `_instanceIdOnEnterOrLeaveImage4Toolbar` together with `_onEnterOrLeaveImage4Toolbar` + // to identify the toolbar instance and its callback function. + int? _instanceIdOnEnterOrLeaveImage4Toolbar; Function(bool)? _onEnterOrLeaveImage4Toolbar; late FFI _ffi; @@ -268,9 +271,18 @@ class _RemotePageState extends State id: widget.id, ffi: _ffi, state: widget.toolbarState, - onEnterOrLeaveImageSetter: (func) => - _onEnterOrLeaveImage4Toolbar = func, - onEnterOrLeaveImageCleaner: () => _onEnterOrLeaveImage4Toolbar = null, + onEnterOrLeaveImageSetter: (id, func) { + _instanceIdOnEnterOrLeaveImage4Toolbar = id; + _onEnterOrLeaveImage4Toolbar = func; + }, + onEnterOrLeaveImageCleaner: (id) { + // If _instanceIdOnEnterOrLeaveImage4Toolbar != id + // it means `_onEnterOrLeaveImage4Toolbar` is not set or it has been changed to another toolbar. + if (_instanceIdOnEnterOrLeaveImage4Toolbar == id) { + _instanceIdOnEnterOrLeaveImage4Toolbar = null; + _onEnterOrLeaveImage4Toolbar = null; + } + }, setRemoteState: setState, ); diff --git a/flutter/lib/desktop/widgets/remote_toolbar.dart b/flutter/lib/desktop/widgets/remote_toolbar.dart index 2e1ca67b0..869fe87a7 100644 --- a/flutter/lib/desktop/widgets/remote_toolbar.dart +++ b/flutter/lib/desktop/widgets/remote_toolbar.dart @@ -332,8 +332,8 @@ class RemoteToolbar extends StatefulWidget { final String id; final FFI ffi; final ToolbarState state; - final Function(Function(bool)) onEnterOrLeaveImageSetter; - final VoidCallback onEnterOrLeaveImageCleaner; + final Function(int, Function(bool)) onEnterOrLeaveImageSetter; + final Function(int) onEnterOrLeaveImageCleaner; final Function(VoidCallback) setRemoteState; RemoteToolbar({ @@ -393,7 +393,7 @@ class _RemoteToolbarState extends State { initialValue: 0, ); - widget.onEnterOrLeaveImageSetter((enter) { + widget.onEnterOrLeaveImageSetter(identityHashCode(this), (enter) { if (enter) { triggerAutoHide(); _isCursorOverImage = true; @@ -413,12 +413,11 @@ class _RemoteToolbarState extends State { dispose() { super.dispose(); - widget.onEnterOrLeaveImageCleaner(); + widget.onEnterOrLeaveImageCleaner(identityHashCode(this)); } @override Widget build(BuildContext context) { - // No need to use future builder here. return Align( alignment: Alignment.topCenter, child: Obx(() => show.value