Refactored shared preferences functions to be generic setters/getters using key/values to allow for multiple preferences to be stored. Refactored the shared preferences functions as a mixin for ease of use. Directory change is now remembered across the app pages.

This commit is contained in:
ElanMan 2021-11-01 14:38:44 +00:00
parent fd9eefe6ab
commit 5836d15654
8 changed files with 47 additions and 44 deletions

View File

@ -1,8 +1,6 @@
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:quickgui/src/app.dart';
import 'package:quickgui/src/globals.dart';
import 'package:quickgui/src/model/operating_system.dart';
import 'package:quickgui/src/model/option.dart';
import 'package:quickgui/src/model/version.dart';
@ -44,7 +42,6 @@ Future<List<OperatingSystem>> loadOperatingSystems(bool showUbuntus) async {
void main() async {
WidgetsFlutterBinding.ensureInitialized();
Directory.current = gCurrentDirectoy;
setWindowTitle('Quickgui : a flutter frontend for Quickget and Quickemu');
setWindowMinSize(const Size(692, 580));
setWindowMaxSize(const Size(692, 580));

View File

@ -7,10 +7,9 @@ class App extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
theme: ThemeData(
primarySwatch: Colors.pink,
),
home: const MainPage(title: 'Quickgui - A Flutter frontend for Quickget and Quickemu'),
);
theme: ThemeData(
primarySwatch: Colors.pink,
),
home: const MainPage(title: 'Quickgui - A Flutter frontend for Quickget and Quickemu'));
}
}

View File

@ -1,6 +1,4 @@
import 'dart:io';
import 'package:flutter/material.dart';
var gIsSnap = Platform.environment['SNAP']?.isNotEmpty ?? false;
var gCurrentDirectoy = Directory(Platform.environment['HOME'] ?? Directory.current.absolute.path);
const String prefWorkingDirectory = 'workingDirectory';

View File

@ -0,0 +1,16 @@
import 'package:shared_preferences/shared_preferences.dart';
mixin PreferencesMixin {
void savePreference(key, value) async {
final prefs = await SharedPreferences.getInstance();
prefs.setString(key, value);
}
Future getPreference(key) async {
final prefs = await SharedPreferences.getInstance();
if (prefs.containsKey(key)) {
final preference = prefs.getString(key);
return preference ?? false;
}
}
}

View File

@ -3,7 +3,6 @@ import 'dart:convert';
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:quickgui/src/globals.dart';
import 'package:quickgui/src/model/operating_system.dart';
import 'package:quickgui/src/model/option.dart';
import 'package:quickgui/src/model/version.dart';
@ -37,7 +36,6 @@ class _DownloaderState extends State<Downloader> {
@override
void initState() {
Directory.current = gCurrentDirectoy;
_progressStream = progressStream();
super.initState();
}
@ -122,7 +120,7 @@ class _DownloaderState extends State<Downloader> {
),
Padding(
padding: const EdgeInsets.only(top: 32),
child: Text("Target folder : $gCurrentDirectoy"),
child: Text("Target folder : ${Directory.current}"),
),
],
);

View File

@ -4,8 +4,9 @@ import 'package:flutter/material.dart';
import 'package:path/path.dart' as path;
import 'package:file_picker/file_picker.dart';
import 'dart:io';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:quickgui/src/globals.dart';
import 'package:quickgui/src/model/vminfo.dart';
import 'package:quickgui/src/mixins/preferences_mixin.dart';
/// VM manager page.
/// Displays a list of available VMs, running state and connection info,
@ -17,18 +18,24 @@ class Manager extends StatefulWidget {
State<Manager> createState() => _ManagerState();
}
class _ManagerState extends State<Manager> {
class _ManagerState extends State<Manager> with PreferencesMixin {
List<String> _currentVms = [];
Map<String, VmInfo> _activeVms = {};
final List<String> _spicyVms = [];
Timer? refreshTimer;
static const String prefsWorkingDirectory = 'workingDirectory';
@override
void initState() {
super.initState();
_getCurrentDirectory();
Future.delayed(Duration.zero, () => _getVms(context)); // Reload VM list when we enter the page.
getPreference(prefWorkingDirectory).then((pref) {
if (pref is String) {
setState(() {
Directory.current = pref;
});
Future.delayed(Duration.zero, () => _getVms(context)); // Reload VM list when we enter the page.
}
});
refreshTimer = Timer.periodic(const Duration(seconds: 5), (Timer t) {
_getVms(context);
}); // Reload VM list every 5 seconds.
@ -40,23 +47,6 @@ class _ManagerState extends State<Manager> {
super.dispose();
}
void _saveCurrentDirectory() async {
final prefs = await SharedPreferences.getInstance();
prefs.setString(prefsWorkingDirectory, Directory.current.path);
}
void _getCurrentDirectory() async {
final prefs = await SharedPreferences.getInstance();
if (prefs.containsKey(prefsWorkingDirectory)) {
setState(() {
final directory = prefs.getString(prefsWorkingDirectory);
if (directory != null) {
Directory.current = directory;
}
});
}
}
VmInfo _parseVmInfo(name) {
String shellScript = File(name + '/' + name + '.sh').readAsStringSync();
RegExpMatch? sshMatch = RegExp('hostfwd=tcp::(\\d+?)-:22').firstMatch(shellScript);
@ -106,8 +96,11 @@ class _ManagerState extends State<Manager> {
onPressed: () async {
String? result = await FilePicker.platform.getDirectoryPath();
if (result != null) {
Directory.current = result;
_saveCurrentDirectory();
setState(() {
Directory.current = result;
});
savePreference(prefWorkingDirectory, Directory.current.path);
_getVms(context);
}
},

View File

@ -1,8 +1,8 @@
import 'dart:io';
import 'package:quickgui/src/globals.dart';
import 'package:quickgui/src/mixins/preferences_mixin.dart';
import 'package:file_picker/file_picker.dart';
import 'package:flutter/material.dart';
import 'package:quickgui/src/globals.dart';
import 'package:quickgui/src/widgets/home_page/home_page_button_group.dart';
class DownloaderMenu extends StatefulWidget {
@ -12,7 +12,7 @@ class DownloaderMenu extends StatefulWidget {
State<DownloaderMenu> createState() => _DownloaderMenuState();
}
class _DownloaderMenuState extends State<DownloaderMenu> {
class _DownloaderMenuState extends State<DownloaderMenu> with PreferencesMixin {
@override
Widget build(BuildContext context) {
return Expanded(
@ -40,12 +40,13 @@ class _DownloaderMenuState extends State<DownloaderMenu> {
var folder = await FilePicker.platform.getDirectoryPath(dialogTitle: "Pick a folder");
if (folder != null) {
setState(() {
gCurrentDirectoy = Directory(folder);
Directory.current = folder;
});
savePreference(prefWorkingDirectory, Directory.current.path);
}
},
child: Text(
"Working directory : ${gCurrentDirectoy.path}",
"Working directory : ${Directory.current.path}",
style: Theme.of(context).textTheme.subtitle1!.copyWith(color: Colors.white),
),
),

View File

@ -36,8 +36,9 @@ dependencies:
cupertino_icons: ^1.0.2
window_size:
git:
url: git://github.com/google/flutter-desktop-embedding.git
url: https://github.com/google/flutter-desktop-embedding.git
path: plugins/window_size
ref: 03d957e8b5c99fc83cd4a781031b154ab3de8753
quiver: ^3.0.1+1
tuple: ^2.0.0
file_picker: ^4.1.6