From 84d054b49408386c7cd2a03f30dec5afa4d653fb Mon Sep 17 00:00:00 2001 From: Levi Date: Wed, 31 Jan 2024 18:45:09 +0800 Subject: [PATCH] fix: start duplicate server on mobile when the app is closed by swiping (#370) --- ui/flutter/lib/database/database.dart | 10 ++++++++++ ui/flutter/lib/main.dart | 21 +++++++++++++++++++-- 2 files changed, 29 insertions(+), 2 deletions(-) diff --git a/ui/flutter/lib/database/database.dart b/ui/flutter/lib/database/database.dart index 0125ec33..b9526beb 100644 --- a/ui/flutter/lib/database/database.dart +++ b/ui/flutter/lib/database/database.dart @@ -6,6 +6,7 @@ import 'package:hive/hive.dart'; import 'entity.dart'; const String _startConfig = 'startConfig'; +const String _lastRunningConfig = 'lastRunningConfig'; const String _windowState = 'windowState'; const String _bookmark = 'bookmark'; const String _createHistory = 'createHistory'; @@ -53,6 +54,15 @@ class Database { _startConfig, (json) => StartConfigEntity.fromJson(json)); } + void saveLastRunningConfig(StartConfigEntity entity) { + save(_lastRunningConfig, entity); + } + + StartConfigEntity? getLastRunningConfig() { + return get( + _lastRunningConfig, (json) => StartConfigEntity.fromJson(json)); + } + /// Patch non-null fields with the original value void saveWindowState(WindowStateEntity entity) { final state = getWindowState(); diff --git a/ui/flutter/lib/main.dart b/ui/flutter/lib/main.dart index 10f3e062..941ae088 100644 --- a/ui/flutter/lib/main.dart +++ b/ui/flutter/lib/main.dart @@ -1,5 +1,6 @@ import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; +import 'package:flutter_foreground_task/flutter_foreground_task.dart'; import 'package:get/get.dart'; import 'package:window_manager/window_manager.dart'; @@ -8,6 +9,7 @@ import 'app/modules/app/controllers/app_controller.dart'; import 'app/modules/app/views/app_view.dart'; import 'core/libgopeed_boot.dart'; import 'database/database.dart'; +import 'database/entity.dart'; import 'i18n/message.dart'; import 'util/locale_manager.dart'; import 'util/log_util.dart'; @@ -52,8 +54,23 @@ Future init() async { try { await controller.loadStartConfig(); final startCfg = controller.startConfig.value; - controller.runningPort.value = await LibgopeedBoot.instance.start(startCfg); - api.init(startCfg.network, controller.runningAddress(), startCfg.apiToken); + // When the app is closed by swiping on the mobile, the backend server is actually still running, don't need to start again. + final isRunning = + Util.isMobile() && (await FlutterForegroundTask.isRunningService); + if (!isRunning) { + controller.runningPort.value = + await LibgopeedBoot.instance.start(startCfg); + api.init( + startCfg.network, controller.runningAddress(), startCfg.apiToken); + Database.instance.saveLastRunningConfig(StartConfigEntity( + network: startCfg.network, + address: controller.runningAddress(), + apiToken: startCfg.apiToken)); + } else { + final lastRunningConfig = Database.instance.getLastRunningConfig()!; + api.init(lastRunningConfig.network, lastRunningConfig.address, + lastRunningConfig.apiToken); + } } catch (e) { logger.e("libgopeed init fail", e); }