From f7cb836d15510628f2095f5742adc8f318ebf079 Mon Sep 17 00:00:00 2001 From: Fabian Freund Date: Wed, 8 Oct 2025 07:47:28 +0200 Subject: [PATCH] dont use complex widget as consumer child to avoid rebuild issues --- .../browser/presentation/screens/browser.dart | 327 +++++++++--------- 1 file changed, 164 insertions(+), 163 deletions(-) diff --git a/app/lib/features/geckoview/features/browser/presentation/screens/browser.dart b/app/lib/features/geckoview/features/browser/presentation/screens/browser.dart index 9d3f9868..3f70c700 100644 --- a/app/lib/features/geckoview/features/browser/presentation/screens/browser.dart +++ b/app/lib/features/geckoview/features/browser/presentation/screens/browser.dart @@ -218,168 +218,6 @@ class BrowserScreen extends HookConsumerWidget { }, ), body: Consumer( - child: DragTarget( - onMove: (details) { - ref - .read(willAcceptDropProvider.notifier) - .setData(DeleteDropData(details.data.tabId)); - }, - onLeave: (data) { - ref.read(willAcceptDropProvider.notifier).clear(); - }, - onAcceptWithDetails: (details) async { - ref.read(willAcceptDropProvider.notifier).clear(); - await ref - .read(tabRepositoryProvider.notifier) - .closeTab(details.data.tabId); - - if (context.mounted) { - ui_helper.showTabUndoClose( - context, - ref.read(tabRepositoryProvider.notifier).undoClose, - ); - } - }, - builder: (context, _, _) { - return OverlayPortal( - controller: overlayController, - overlayChildBuilder: (context) { - return overlayBuilder!.call(context); - }, - child: Listener( - onPointerDown: sheetController.value != null - ? (_) { - ref - .read(bottomSheetControllerProvider.notifier) - .requestDismiss(); - } - : null, - child: BackButtonListener( - onBackButtonPressed: () async { - final tabState = ref.read(selectedTabStateProvider); - - final tabCount = ref.read( - tabListProvider.select((tabs) => tabs.value.length), - ); - - //Don't do anything if a child route is active - if (GoRouterState.of(context).topRoute?.name != - BrowserRoute.name) { - return false; - } - - if (ref.read(bottomSheetControllerProvider) != null) { - ref - .read(bottomSheetControllerProvider.notifier) - .requestDismiss(); - return true; - } - - if (overlayBuilder != null) { - ref - .read(overlayControllerProvider.notifier) - .dismiss(); - return true; - } - - if (tabState?.isFullScreen == true) { - await ref - .read(selectedTabSessionProvider) - .exitFullscreen(); - return true; - } - - //Make sure app bar is visible - showAppBar.value = true; - - if (tabState?.isLoading == true) { - lastBackButtonPress.value = null; - - final controller = ref.read( - selectedTabSessionProvider, - ); - - await controller.stopLoading(); - return true; - } else if (tabState?.readerableState.active == true) { - lastBackButtonPress.value = null; - - await ref - .read(readerableScreenControllerProvider.notifier) - .toggleReaderView(false); - - return true; - } else if (tabState?.historyState.canGoBack == true) { - lastBackButtonPress.value = null; - - final controller = ref.read( - selectedTabSessionProvider, - ); - - await controller.goBack(); - return true; - } - - //Go router has routes to go back to - if (context.canPop()) { - return true; - } - - if (ref - .read(tabRepositoryProvider.notifier) - .hasLaunchedFromIntent(tabState?.id)) { - //Mark back as unhandled and navigator will pop - await SystemNavigator.pop(); - return false; - } - - if (lastBackButtonPress.value != null && - DateTime.now().difference( - lastBackButtonPress.value!, - ) < - _backButtonPressTimeout) { - lastBackButtonPress.value = null; - - if (tabState != null && tabCount > 1) { - await ref - .read(tabRepositoryProvider.notifier) - .closeTab(tabState.id); - - if (context.mounted) { - ui_helper.showTabUndoClose( - context, - ref - .read(tabRepositoryProvider.notifier) - .undoClose, - ); - } - - return true; - } else { - //Mark back as unhandled and navigator will pop - await SystemNavigator.pop(); - return false; - } - } else { - lastBackButtonPress.value = DateTime.now(); - ui_helper.showTabBackButtonMessage( - context, - tabCount, - _backButtonPressTimeout, - ); - - return true; - } - }, - child: _BrowserView( - sheetDisplayed: sheetController.value != null, - isFullscreen: tabInFullScreen, - ), - ), - ), - ); - }, - ), builder: (context, ref, child) { ref.listen(bottomSheetControllerProvider, (previous, next) { if (sheetController.value != null) { @@ -438,7 +276,170 @@ class BrowserScreen extends HookConsumerWidget { } }); - return child!; + return DragTarget( + onMove: (details) { + ref + .read(willAcceptDropProvider.notifier) + .setData(DeleteDropData(details.data.tabId)); + }, + onLeave: (data) { + ref.read(willAcceptDropProvider.notifier).clear(); + }, + onAcceptWithDetails: (details) async { + ref.read(willAcceptDropProvider.notifier).clear(); + await ref + .read(tabRepositoryProvider.notifier) + .closeTab(details.data.tabId); + + if (context.mounted) { + ui_helper.showTabUndoClose( + context, + ref.read(tabRepositoryProvider.notifier).undoClose, + ); + } + }, + builder: (context, _, _) { + return OverlayPortal( + controller: overlayController, + overlayChildBuilder: (context) { + return overlayBuilder!.call(context); + }, + child: Listener( + onPointerDown: sheetController.value != null + ? (_) { + ref + .read(bottomSheetControllerProvider.notifier) + .requestDismiss(); + } + : null, + child: BackButtonListener( + onBackButtonPressed: () async { + final tabState = ref.read(selectedTabStateProvider); + + final tabCount = ref.read( + tabListProvider.select((tabs) => tabs.value.length), + ); + + //Don't do anything if a child route is active + if (GoRouterState.of(context).topRoute?.name != + BrowserRoute.name) { + return false; + } + + if (ref.read(bottomSheetControllerProvider) != null) { + ref + .read(bottomSheetControllerProvider.notifier) + .requestDismiss(); + return true; + } + + if (overlayBuilder != null) { + ref + .read(overlayControllerProvider.notifier) + .dismiss(); + return true; + } + + if (tabState?.isFullScreen == true) { + await ref + .read(selectedTabSessionProvider) + .exitFullscreen(); + return true; + } + + //Make sure app bar is visible + showAppBar.value = true; + + if (tabState?.isLoading == true) { + lastBackButtonPress.value = null; + + final controller = ref.read( + selectedTabSessionProvider, + ); + + await controller.stopLoading(); + return true; + } else if (tabState?.readerableState.active == true) { + lastBackButtonPress.value = null; + + await ref + .read( + readerableScreenControllerProvider.notifier, + ) + .toggleReaderView(false); + + return true; + } else if (tabState?.historyState.canGoBack == true) { + lastBackButtonPress.value = null; + + final controller = ref.read( + selectedTabSessionProvider, + ); + + await controller.goBack(); + return true; + } + + //Go router has routes to go back to + if (context.canPop()) { + return true; + } + + if (ref + .read(tabRepositoryProvider.notifier) + .hasLaunchedFromIntent(tabState?.id)) { + //Mark back as unhandled and navigator will pop + await SystemNavigator.pop(); + return false; + } + + if (lastBackButtonPress.value != null && + DateTime.now().difference( + lastBackButtonPress.value!, + ) < + _backButtonPressTimeout) { + lastBackButtonPress.value = null; + + if (tabState != null && tabCount > 1) { + await ref + .read(tabRepositoryProvider.notifier) + .closeTab(tabState.id); + + if (context.mounted) { + ui_helper.showTabUndoClose( + context, + ref + .read(tabRepositoryProvider.notifier) + .undoClose, + ); + } + + return true; + } else { + //Mark back as unhandled and navigator will pop + await SystemNavigator.pop(); + return false; + } + } else { + lastBackButtonPress.value = DateTime.now(); + ui_helper.showTabBackButtonMessage( + context, + tabCount, + _backButtonPressTimeout, + ); + + return true; + } + }, + child: _BrowserView( + sheetDisplayed: sheetController.value != null, + isFullscreen: tabInFullScreen, + ), + ), + ), + ); + }, + ); }, ), floatingActionButton: ReaderAppearanceButton(),