diff --git a/flutter/lib/desktop/pages/desktop_setting_page.dart b/flutter/lib/desktop/pages/desktop_setting_page.dart index 422b4d3e1..0a20c93e1 100644 --- a/flutter/lib/desktop/pages/desktop_setting_page.dart +++ b/flutter/lib/desktop/pages/desktop_setting_page.dart @@ -932,6 +932,10 @@ class _NetworkState extends State<_Network> with AutomaticKeepAliveClientMixin { return false; } } + final old = await bind.mainGetOption(key: 'custom-rendezvous-server'); + if (old.isNotEmpty && old != idServer) { + await gFFI.userModel.logOut(); + } // should set one by one await bind.mainSetOption( key: 'custom-rendezvous-server', value: idServer); diff --git a/flutter/lib/mobile/pages/scan_page.dart b/flutter/lib/mobile/pages/scan_page.dart index 3bd381d92..810bcbca3 100644 --- a/flutter/lib/mobile/pages/scan_page.dart +++ b/flutter/lib/mobile/pages/scan_page.dart @@ -261,6 +261,9 @@ void showServerSettingsWithValue(String id, String relay, String key, }); if (await validate()) { if (id != id0) { + if (id0.isNotEmpty) { + await gFFI.userModel.logOut(); + } bind.mainSetOption(key: "custom-rendezvous-server", value: id); } if (relay != relay0) { diff --git a/flutter/lib/mobile/pages/server_page.dart b/flutter/lib/mobile/pages/server_page.dart index 38ad18f14..abccdf683 100644 --- a/flutter/lib/mobile/pages/server_page.dart +++ b/flutter/lib/mobile/pages/server_page.dart @@ -1,3 +1,5 @@ +import 'dart:async'; + import 'package:flutter/material.dart'; import 'package:flutter_hbb/mobile/widgets/dialog.dart'; import 'package:provider/provider.dart'; @@ -107,12 +109,23 @@ class ServerPage extends StatefulWidget implements PageShape { } class _ServerPageState extends State { + Timer? _updateTimer; + @override void initState() { super.initState(); + _updateTimer = periodic_immediate(const Duration(seconds: 3), () async { + await gFFI.serverModel.fetchID(); + }); gFFI.serverModel.checkAndroidPermission(); } + @override + void dispose() { + _updateTimer?.cancel(); + super.dispose(); + } + @override Widget build(BuildContext context) { checkService(); diff --git a/flutter/lib/models/user_model.dart b/flutter/lib/models/user_model.dart index 751b01637..44fef5443 100644 --- a/flutter/lib/models/user_model.dart +++ b/flutter/lib/models/user_model.dart @@ -1,7 +1,6 @@ import 'dart:async'; import 'dart:convert'; -import 'package:flutter_hbb/common/hbbs/hbbs.dart'; import 'package:flutter_hbb/common/widgets/peer_tab_page.dart'; import 'package:get/get.dart'; import 'package:http/http.dart' as http; @@ -78,15 +77,18 @@ class UserModel { Future logOut() async { final tag = gFFI.dialogManager.showLoading(translate('Waiting')); - final url = await bind.mainGetApiServer(); - final _ = await http.post(Uri.parse('$url/api/logout'), - body: { - 'id': await bind.mainGetMyId(), - 'uuid': await bind.mainGetUuid(), - }, - headers: await getHttpHeaders()); - await reset(); - gFFI.dialogManager.dismissByTag(tag); + try { + final url = await bind.mainGetApiServer(); + final _ = await http.post(Uri.parse('$url/api/logout'), + body: { + 'id': await bind.mainGetMyId(), + 'uuid': await bind.mainGetUuid(), + }, + headers: await getHttpHeaders()); + } finally { + await reset(); + gFFI.dialogManager.dismissByTag(tag); + } } Future> login(String userName, String pass) async {