Remove SharedPreferences, debug win

Signed-off-by: fufesou <shuanglongchen@yeah.net>
This commit is contained in:
fufesou
2022-11-10 21:25:12 +08:00
parent 0cf2bfb5ef
commit 50d885d3e7
21 changed files with 297 additions and 182 deletions

View File

@@ -5,6 +5,7 @@ import 'package:file_picker/file_picker.dart';
import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_hbb/common.dart';
import 'package:flutter_hbb/consts.dart';
import 'package:flutter_hbb/desktop/pages/desktop_home_page.dart';
import 'package:flutter_hbb/desktop/pages/desktop_tab_page.dart';
import 'package:flutter_hbb/desktop/widgets/login.dart';
@@ -30,8 +31,8 @@ const double _kListViewBottomMargin = 15;
const double _kTitleFontSize = 20;
const double _kContentFontSize = 15;
const Color _accentColor = MyTheme.accent;
const String _kSettingPageControllerTag = "settingPageController";
const String _kSettingPageIndexTag = "settingPageIndex";
const String _kSettingPageControllerTag = 'settingPageController';
const String _kSettingPageIndexTag = 'settingPageIndex';
class _TabInfo {
late final String label;
@@ -250,19 +251,19 @@ class _GeneralState extends State<_General> {
return _Card(title: 'Theme', children: [
_Radio<String>(context,
value: "light",
value: 'light',
groupValue: current,
label: "Light",
label: 'Light',
onChanged: onChanged),
_Radio<String>(context,
value: "dark",
value: 'dark',
groupValue: current,
label: "Dark",
label: 'Dark',
onChanged: onChanged),
_Radio<String>(context,
value: "system",
value: 'system',
groupValue: current,
label: "Follow System",
label: 'Follow System',
onChanged: onChanged),
]);
}
@@ -286,8 +287,8 @@ class _GeneralState extends State<_General> {
Widget audio(BuildContext context) {
String getDefault() {
if (Platform.isWindows) return "System Sound";
return "";
if (Platform.isWindows) return 'System Sound';
return '';
}
Future<String> getValue() async {
@@ -300,7 +301,7 @@ class _GeneralState extends State<_General> {
}
setDevice(String device) {
if (device == getDefault()) device = "";
if (device == getDefault()) device = '';
bind.mainSetOption(key: 'audio-input', value: device);
}
@@ -353,7 +354,7 @@ class _GeneralState extends State<_General> {
'allow-auto-record-incoming'),
Row(
children: [
Text('${translate('Directory')}:'),
Text('${translate("Directory")}:'),
Expanded(
child: GestureDetector(
onTap: canlaunch ? () => launchUrl(Uri.file(dir)) : null,
@@ -386,26 +387,26 @@ class _GeneralState extends State<_General> {
Widget language() {
return _futureBuilder(future: () async {
String langs = await bind.mainGetLangs();
String lang = await bind.mainGetLocalOption(key: "lang");
return {"langs": langs, "lang": lang};
String lang = bind.mainGetLocalOption(key: kCommConfKeyLang);
return {'langs': langs, 'lang': lang};
}(), hasData: (res) {
Map<String, String> data = res as Map<String, String>;
List<dynamic> langsList = jsonDecode(data["langs"]!);
List<dynamic> langsList = jsonDecode(data['langs']!);
Map<String, String> langsMap = {for (var v in langsList) v[0]: v[1]};
List<String> keys = langsMap.keys.toList();
List<String> values = langsMap.values.toList();
keys.insert(0, "");
values.insert(0, "Default");
String currentKey = data["lang"]!;
keys.insert(0, '');
values.insert(0, 'Default');
String currentKey = data['lang']!;
if (!keys.contains(currentKey)) {
currentKey = "";
currentKey = '';
}
return _ComboBox(
keys: keys,
values: values,
initialKey: currentKey,
onChanged: (key) async {
await bind.mainSetLocalOption(key: "lang", value: key);
await bind.mainSetLocalOption(key: kCommConfKeyLang, value: key);
reloadAllWindows();
bind.mainChangeLanguage(lang: key);
},
@@ -585,9 +586,9 @@ class _SafetyState extends State<_Safety> with AutomaticKeepAliveClientMixin {
kUseBothPasswords,
];
List<String> values = [
translate("Use temporary password"),
translate("Use permanent password"),
translate("Use both passwords"),
translate('Use temporary password'),
translate('Use permanent password'),
translate('Use both passwords'),
];
bool tmpEnabled = model.verificationMethod != kUsePermanentPassword;
bool permEnabled = model.verificationMethod != kUseTemporaryPassword;
@@ -830,12 +831,12 @@ class _NetworkState extends State<_Network> with AutomaticKeepAliveClientMixin {
// Setting page is not modal, oldOptions should only be used when getting options, never when setting.
Map<String, dynamic> oldOptions = jsonDecode(data! as String);
old(String key) {
return (oldOptions[key] ?? "").trim();
return (oldOptions[key] ?? '').trim();
}
RxString idErrMsg = "".obs;
RxString relayErrMsg = "".obs;
RxString apiErrMsg = "".obs;
RxString idErrMsg = ''.obs;
RxString relayErrMsg = ''.obs;
RxString apiErrMsg = ''.obs;
var idController =
TextEditingController(text: old('custom-rendezvous-server'));
var relayController = TextEditingController(text: old('relay-server'));
@@ -864,9 +865,9 @@ class _NetworkState extends State<_Network> with AutomaticKeepAliveClientMixin {
}
if (apiServer.isNotEmpty) {
if (!apiServer.startsWith('http://') ||
!apiServer.startsWith("https://")) {
!apiServer.startsWith('https://')) {
apiErrMsg.value =
"${translate("API Server")}: ${translate("invalid_http")}";
'${translate("API Server")}: ${translate("invalid_http")}';
return false;
}
}
@@ -893,7 +894,7 @@ class _NetworkState extends State<_Network> with AutomaticKeepAliveClientMixin {
import() {
Clipboard.getData(Clipboard.kTextPlain).then((value) {
TextEditingController mytext = TextEditingController();
String? aNullableString = "";
String? aNullableString = '';
aNullableString = value?.text;
mytext.text = aNullableString.toString();
if (mytext.text.isNotEmpty) {
@@ -918,13 +919,13 @@ class _NetworkState extends State<_Network> with AutomaticKeepAliveClientMixin {
}
});
} else {
showToast(translate("Invalid server configuration"));
showToast(translate('Invalid server configuration'));
}
} catch (e) {
showToast(translate("Invalid server configuration"));
showToast(translate('Invalid server configuration'));
}
} else {
showToast(translate("Clipboard is empty"));
showToast(translate('Clipboard is empty'));
}
});
}
@@ -936,7 +937,7 @@ class _NetworkState extends State<_Network> with AutomaticKeepAliveClientMixin {
config['ApiServer'] = apiController.text.trim();
config['Key'] = keyController.text.trim();
Clipboard.setData(ClipboardData(text: jsonEncode(config)));
showToast(translate("Export server configuration successfully"));
showToast(translate('Export server configuration successfully'));
}
bool secure = !enabled;
@@ -962,7 +963,7 @@ class _NetworkState extends State<_Network> with AutomaticKeepAliveClientMixin {
Obx(() => _LabeledTextField(context, 'API Server', apiController,
apiErrMsg.value, enabled, secure)),
_LabeledTextField(
context, 'Key', keyController, "", enabled, secure),
context, 'Key', keyController, '', enabled, secure),
Row(
mainAxisAlignment: MainAxisAlignment.end,
children: [_Button('Apply', submit, enabled: enabled)],
@@ -1039,28 +1040,28 @@ class _AboutState extends State<_About> {
child: SingleChildScrollView(
controller: scrollController,
physics: NeverScrollableScrollPhysics(),
child: _Card(title: "About RustDesk", children: [
child: _Card(title: 'About RustDesk', children: [
Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
const SizedBox(
height: 8.0,
),
Text("Version: $version").marginSymmetric(vertical: 4.0),
Text('Version: $version').marginSymmetric(vertical: 4.0),
InkWell(
onTap: () {
launchUrlString("https://rustdesk.com/privacy");
launchUrlString('https://rustdesk.com/privacy');
},
child: const Text(
"Privacy Statement",
'Privacy Statement',
style: linkStyle,
).marginSymmetric(vertical: 4.0)),
InkWell(
onTap: () {
launchUrlString("https://rustdesk.com");
launchUrlString('https://rustdesk.com');
},
child: const Text(
"Website",
'Website',
style: linkStyle,
).marginSymmetric(vertical: 4.0)),
Container(
@@ -1074,11 +1075,11 @@ class _AboutState extends State<_About> {
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
"Copyright &copy; 2022 Purslane Ltd.\n$license",
'Copyright &copy; 2022 Purslane Ltd.\n$license',
style: const TextStyle(color: Colors.white),
),
const Text(
"Made with heart in this chaotic world!",
'Made with heart in this chaotic world!',
style: TextStyle(
fontWeight: FontWeight.w800,
color: Colors.white),
@@ -1472,10 +1473,10 @@ class _ComboBox extends StatelessWidget {
void changeSocks5Proxy() async {
var socks = await bind.mainGetSocks();
String proxy = "";
String proxyMsg = "";
String username = "";
String password = "";
String proxy = '';
String proxyMsg = '';
String username = '';
String password = '';
if (socks.length == 3) {
proxy = socks[0];
username = socks[1];
@@ -1489,7 +1490,7 @@ void changeSocks5Proxy() async {
gFFI.dialogManager.show((setState, close) {
submit() async {
setState(() {
proxyMsg = "";
proxyMsg = '';
isInProgress = true;
});
cancel() {
@@ -1517,7 +1518,7 @@ void changeSocks5Proxy() async {
}
return CustomAlertDialog(
title: Text(translate("Socks5 Proxy")),
title: Text(translate('Socks5 Proxy')),
content: ConstrainedBox(
constraints: const BoxConstraints(minWidth: 500),
child: Column(
@@ -1530,7 +1531,7 @@ void changeSocks5Proxy() async {
children: [
ConstrainedBox(
constraints: const BoxConstraints(minWidth: 100),
child: Text("${translate('Hostname')}:")
child: Text('${translate("Hostname")}:')
.marginOnly(bottom: 16.0)),
const SizedBox(
width: 24.0,
@@ -1553,7 +1554,7 @@ void changeSocks5Proxy() async {
children: [
ConstrainedBox(
constraints: const BoxConstraints(minWidth: 100),
child: Text("${translate('Username')}:")
child: Text('${translate("Username")}:')
.marginOnly(bottom: 16.0)),
const SizedBox(
width: 24.0,
@@ -1575,7 +1576,7 @@ void changeSocks5Proxy() async {
children: [
ConstrainedBox(
constraints: const BoxConstraints(minWidth: 100),
child: Text("${translate('Password')}:")
child: Text('${translate("Password")}:')
.marginOnly(bottom: 16.0)),
const SizedBox(
width: 24.0,
@@ -1599,8 +1600,8 @@ void changeSocks5Proxy() async {
),
),
actions: [
TextButton(onPressed: close, child: Text(translate("Cancel"))),
TextButton(onPressed: submit, child: Text(translate("OK"))),
TextButton(onPressed: close, child: Text(translate('Cancel'))),
TextButton(onPressed: submit, child: Text(translate('OK'))),
],
onSubmit: submit,
onCancel: close,

View File

@@ -7,7 +7,6 @@ import 'package:flutter/material.dart';
import 'package:flutter/services.dart';
import 'package:flutter_hbb/models/chat_model.dart';
import 'package:flutter_hbb/models/state_model.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:get/get.dart';
import 'package:provider/provider.dart';
import 'package:rxdart/rxdart.dart' as rxdart;
@@ -28,12 +27,14 @@ class MenubarState {
late RxBool _pin;
MenubarState() {
final s = Get.find<SharedPreferences>().getString(kStoreKey);
if (s == null) {
final s = bind.getLocalFlutterConfig(k: kStoreKey);
if (s.isEmpty) {
_initSet(false, false);
return;
}
try {
final m = jsonDecode(s!);
final m = jsonDecode(s);
if (m == null) {
_initSet(false, false);
} else {
@@ -77,11 +78,8 @@ class MenubarState {
}
save() async {
final success = await Get.find<SharedPreferences>()
.setString(kStoreKey, jsonEncode({'pin': _pin.value}.toString()));
if (!success) {
debugPrint('Failed to save remote menu bar state');
}
bind.setLocalFlutterConfig(
k: kStoreKey, v: jsonEncode({'pin': _pin.value}));
}
}