From 334526026cad032376166fa4b69f97db4bc63806 Mon Sep 17 00:00:00 2001 From: fufesou <13586388+fufesou@users.noreply.github.com> Date: Tue, 1 Oct 2024 15:25:59 +0800 Subject: [PATCH] fix: web/mobile, skip querying onlines, if not in main page (#9535) * fix: web, skip querying onlines, if not in main page Signed-off-by: fufesou * fix: web/mobile, skip querying onlines Signed-off-by: fufesou * Set isInMainPage to false after router is changed. Signed-off-by: fufesou --------- Signed-off-by: fufesou --- flutter/lib/common.dart | 3 +++ flutter/lib/common/widgets/peers_view.dart | 7 ++++++- flutter/lib/mobile/pages/home_page.dart | 2 ++ flutter/lib/models/state_model.dart | 3 +++ flutter/lib/models/web_model.dart | 11 ++++++++++- flutter/lib/web/settings_page.dart | 1 - 6 files changed, 24 insertions(+), 3 deletions(-) diff --git a/flutter/lib/common.dart b/flutter/lib/common.dart index 7b6ec4ae5..99a24781b 100644 --- a/flutter/lib/common.dart +++ b/flutter/lib/common.dart @@ -680,10 +680,12 @@ closeConnection({String? id}) { overlays: SystemUiOverlay.values); gFFI.chatModel.hideChatOverlay(); Navigator.popUntil(globalKey.currentContext!, ModalRoute.withName("/")); + stateGlobal.isInMainPage = true; }(); } else { if (isWeb) { Navigator.popUntil(globalKey.currentContext!, ModalRoute.withName("/")); + stateGlobal.isInMainPage = true; } else { final controller = Get.find(); controller.closeBy(id); @@ -2405,6 +2407,7 @@ connect(BuildContext context, String id, ); } } + stateGlobal.isInMainPage = false; } FocusScopeNode currentFocus = FocusScope.of(context); diff --git a/flutter/lib/common/widgets/peers_view.dart b/flutter/lib/common/widgets/peers_view.dart index 32db418f5..7f1685021 100644 --- a/flutter/lib/common/widgets/peers_view.dart +++ b/flutter/lib/common/widgets/peers_view.dart @@ -332,7 +332,12 @@ class _PeersViewState extends State<_PeersView> _queryOnlines(false); } } else { - if (_isActive && (_queryCount < _maxQueryCount || !p)) { + final skipIfIsWeb = + isWeb && !(stateGlobal.isWebVisible && stateGlobal.isInMainPage); + final skipIfMobile = + (isAndroid || isIOS) && !stateGlobal.isInMainPage; + final skipIfNotActive = skipIfIsWeb || skipIfMobile || !_isActive; + if (!skipIfNotActive && (_queryCount < _maxQueryCount || !p)) { if (now.difference(_lastQueryTime) >= _queryInterval) { if (_curPeers.isNotEmpty) { bind.queryOnlines(ids: _curPeers.toList(growable: false)); diff --git a/flutter/lib/mobile/pages/home_page.dart b/flutter/lib/mobile/pages/home_page.dart index d26d91685..e329acdfe 100644 --- a/flutter/lib/mobile/pages/home_page.dart +++ b/flutter/lib/mobile/pages/home_page.dart @@ -6,6 +6,7 @@ import 'package:get/get.dart'; import '../../common.dart'; import '../../common/widgets/chat_page.dart'; import '../../models/platform_model.dart'; +import '../../models/state_model.dart'; import 'connection_page.dart'; abstract class PageShape extends Widget { @@ -159,6 +160,7 @@ class WebHomePage extends StatelessWidget { @override Widget build(BuildContext context) { + stateGlobal.isInMainPage = true; return Scaffold( // backgroundColor: MyTheme.grayBg, appBar: AppBar( diff --git a/flutter/lib/models/state_model.dart b/flutter/lib/models/state_model.dart index e18874785..a1b5fc736 100644 --- a/flutter/lib/models/state_model.dart +++ b/flutter/lib/models/state_model.dart @@ -19,6 +19,9 @@ class StateGlobal { final RxBool showRemoteToolBar = false.obs; final svcStatus = SvcStatus.notReady.obs; final RxBool isFocused = false.obs; + // for mobile and web + bool isInMainPage = true; + bool isWebVisible = true; final isPortrait = false.obs; diff --git a/flutter/lib/models/web_model.dart b/flutter/lib/models/web_model.dart index 4896781a9..ff0d1b806 100644 --- a/flutter/lib/models/web_model.dart +++ b/flutter/lib/models/web_model.dart @@ -7,6 +7,7 @@ import 'dart:html'; import 'dart:async'; import 'package:flutter/foundation.dart'; +import 'package:flutter_hbb/models/state_model.dart'; import 'package:flutter_hbb/web/bridge.dart'; import 'package:flutter_hbb/common.dart'; @@ -28,7 +29,15 @@ class PlatformFFI { context.callMethod('setByName', [name, value]); } - PlatformFFI._(); + PlatformFFI._() { + window.document.addEventListener( + 'visibilitychange', + (event) => { + stateGlobal.isWebVisible = + window.document.visibilityState == 'visible' + }); + } + static final PlatformFFI instance = PlatformFFI._(); static get localeName => window.navigator.language; diff --git a/flutter/lib/web/settings_page.dart b/flutter/lib/web/settings_page.dart index 13ba6cb2f..cbd79a718 100644 --- a/flutter/lib/web/settings_page.dart +++ b/flutter/lib/web/settings_page.dart @@ -95,4 +95,3 @@ class WebSettingsPage extends StatelessWidget { }); } } -