Switched to getx for state management

Fixed last remaining bug
This commit is contained in:
Alessandro Autiero
2022-09-06 14:18:31 +02:00
parent ddc088e7d4
commit 94eaa2abb0
33 changed files with 429 additions and 1033 deletions

View File

@@ -1,19 +1,9 @@
import 'dart:convert';
import 'dart:io';
import 'package:fluent_ui/fluent_ui.dart';
import 'package:reboot_launcher/src/util/game_process_controller.dart';
import 'package:shared_preferences/shared_preferences.dart';
import 'package:reboot_launcher/src/page/info_page.dart';
import 'package:reboot_launcher/src/page/launcher_page.dart';
import 'package:reboot_launcher/src/page/server_page.dart';
import 'package:reboot_launcher/src/widget/window_buttons.dart';
import '../model/fortnite_version.dart';
import '../util/generic_controller.dart';
import '../util/reboot.dart';
import '../util/version_controller.dart';
class HomePage extends StatefulWidget {
const HomePage({Key? key}) : super(key: key);
@@ -22,129 +12,27 @@ class HomePage extends StatefulWidget {
}
class _HomePageState extends State<HomePage> {
late final TextEditingController _usernameController;
late final VersionController _versionController;
late final GenericController<bool> _rebootController;
late final GenericController<bool> _localController;
late final TextEditingController _hostController;
late final TextEditingController _portController;
late final GameProcessController _gameProcessController;
late final GenericController<Process?> _serverController;
late final GenericController<bool> _startedServerController;
late final GenericController<bool> _startedGameController;
late Future _future;
bool _loaded = false;
final List<Widget> _children = [LauncherPage(), ServerPage(), const InfoPage()];
int _index = 0;
@override
void initState(){
_future = _load();
super.initState();
}
Future<bool> _load() async {
if (_loaded) {
return false;
}
var preferences = await SharedPreferences.getInstance();
await downloadRebootDll(preferences);
Iterable json = jsonDecode(preferences.getString("versions") ?? "[]");
var versions =
json.map((entry) => FortniteVersion.fromJson(entry)).toList();
var selectedVersion = preferences.getString("version");
_versionController = VersionController(
versions: versions,
serializer: _saveVersions,
selectedVersion: selectedVersion != null
? versions.firstWhere((element) => element.name == selectedVersion)
: null);
_rebootController =
GenericController(initialValue: preferences.getBool("reboot") ?? false);
_usernameController =
TextEditingController(text: preferences.getString("${_rebootController.value ? "host" : "game"}_username"));
_localController =
GenericController(initialValue: preferences.getBool("local") ?? true);
_hostController =
TextEditingController(text: preferences.getString("host"));
_portController =
TextEditingController(text: preferences.getString("port"));
_gameProcessController = GameProcessController();
_serverController = GenericController(initialValue: null);
_startedServerController = GenericController(initialValue: false);
_startedGameController = GenericController(initialValue: false);
_loaded = true;
return true;
}
Future<void> _saveVersions() async {
var preferences = await SharedPreferences.getInstance();
var versions =
_versionController.versions.map((entry) => entry.toJson()).toList();
preferences.setString("versions", jsonEncode(versions));
}
@override
Widget build(BuildContext context) {
return NavigationView(
pane: NavigationPane(
selected: _index,
onChanged: (index) => setState(() => _index = index),
displayMode: PaneDisplayMode.top,
indicator: const EndNavigationIndicator(),
items: [
_createPane("Launcher", FluentIcons.game),
_createPane("Server", FluentIcons.server_enviroment),
_createPane("Info", FluentIcons.info),
],
trailing: const WindowTitleBar()),
content: FutureBuilder(
future: _future,
builder: (context, snapshot) {
if (snapshot.hasError) {
return Center(
child: Text(
"An error occurred while loading the launcher: ${snapshot.error}",
textAlign: TextAlign.center));
}
if (!snapshot.hasData) {
return const Center(child: ProgressRing());
}
return NavigationBody(index: _index, children: [
LauncherPage(
usernameController: _usernameController,
versionController: _versionController,
rebootController: _rebootController,
serverController: _serverController,
localController: _localController,
gameProcessController: _gameProcessController,
startedGameController: _startedGameController,
startedServerController: _startedServerController
),
ServerPage(
localController: _localController,
hostController: _hostController,
portController: _portController,
serverController: _serverController,
startedServerController: _startedServerController
),
const InfoPage()
]);
}),
pane: NavigationPane(
selected: _index,
onChanged: (index) => setState(() => _index = index),
displayMode: PaneDisplayMode.top,
indicator: const EndNavigationIndicator(),
items: [
_createPane("Launcher", FluentIcons.game),
_createPane("Server", FluentIcons.server_enviroment),
_createPane("Info", FluentIcons.info),
],
trailing: const WindowTitleBar()),
content: NavigationBody(
index: _index,
children: _children
)
);
}

View File

@@ -10,10 +10,7 @@ class InfoPage extends StatelessWidget {
Widget build(BuildContext context) {
return Column(
children: [
const Expanded(
child: SizedBox()
),
const Expanded(child: SizedBox()),
Column(
children: [
const CircleAvatar(
@@ -31,13 +28,9 @@ class InfoPage extends StatelessWidget {
onPressed: () => launchUrl(Uri.parse(_discordLink))),
],
),
const Expanded(
child: Align(
alignment: Alignment.bottomLeft,
child: Text("Version 1.0")
)
)
alignment: Alignment.bottomLeft, child: Text("Version 2.2")))
],
);
}

View File

@@ -1,69 +1,33 @@
import 'dart:async';
import 'dart:io';
import 'package:fluent_ui/fluent_ui.dart';
import 'package:reboot_launcher/src/util/game_process_controller.dart';
import 'package:reboot_launcher/src/util/generic_controller.dart';
import 'package:reboot_launcher/src/util/version_controller.dart';
import 'package:get/get.dart';
import 'package:reboot_launcher/src/controller/game_controller.dart';
import 'package:reboot_launcher/src/widget/deployment_selector.dart';
import 'package:reboot_launcher/src/widget/launch_button.dart';
import 'package:reboot_launcher/src/widget/restart_warning.dart';
import 'package:reboot_launcher/src/widget/username_box.dart';
import 'package:shared_preferences/shared_preferences.dart';
import '../widget/version_selector.dart';
import 'package:reboot_launcher/src/widget/version_selector.dart';
import 'package:reboot_launcher/src/controller/warning_controller.dart';
class LauncherPage extends StatelessWidget {
final TextEditingController usernameController;
final VersionController versionController;
final GenericController<bool> rebootController;
final GenericController<Process?> serverController;
final GenericController<bool> localController;
final GameProcessController gameProcessController;
final GenericController<bool> startedGameController;
final GenericController<bool> startedServerController;
final StreamController _streamController = StreamController();
final WarningController _warningController = Get.put(WarningController());
final GameController _gameController = Get.put(GameController());
LauncherPage(
{Key? key,
required this.usernameController,
required this.versionController,
required this.rebootController,
required this.serverController,
required this.localController,
required this.gameProcessController,
required this.startedGameController,
required this.startedServerController})
: super(key: key);
LauncherPage({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
StreamBuilder(
stream: _streamController.stream,
builder: (context, snapshot) => UsernameBox(
controller: usernameController,
rebootController: rebootController)),
VersionSelector(
controller: versionController,
),
DeploymentSelector(
controller: rebootController,
onSelected: () => _streamController.add(null),
enabled: true
),
LaunchButton(
usernameController: usernameController,
versionController: versionController,
rebootController: rebootController,
serverController: serverController,
localController: localController,
gameProcessController: gameProcessController,
startedGameController: startedGameController,
startedServerController: startedServerController)
],
);
return Obx(() => Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
if (_warningController.warning.value) const RestartWarning(),
UsernameBox(),
VersionSelector(),
DeploymentSelector(enabled: true),
const LaunchButton()
],
));
}
}

View File

@@ -1,62 +1,32 @@
import 'dart:async';
import 'dart:io';
import 'package:fluent_ui/fluent_ui.dart';
import 'package:reboot_launcher/src/util/generic_controller.dart';
import 'package:get/get.dart';
import 'package:reboot_launcher/src/controller/server_controller.dart';
import 'package:reboot_launcher/src/controller/warning_controller.dart';
import 'package:reboot_launcher/src/widget/local_server_switch.dart';
import 'package:reboot_launcher/src/widget/port_input.dart';
import '../widget/host_input.dart';
import '../widget/server_button.dart';
import 'package:reboot_launcher/src/widget/host_input.dart';
import 'package:reboot_launcher/src/widget/server_button.dart';
class ServerPage extends StatefulWidget {
final GenericController<bool> localController;
final TextEditingController hostController;
final TextEditingController portController;
final GenericController<Process?> serverController;
final GenericController<bool> startedServerController;
import 'package:reboot_launcher/src/widget/restart_warning.dart';
const ServerPage(
{Key? key,
required this.localController,
required this.hostController,
required this.serverController,
required this.portController,
required this.startedServerController})
: super(key: key);
class ServerPage extends StatelessWidget {
final WarningController _warningController = Get.put(WarningController());
final ServerController _serverController = Get.put(ServerController());
@override
State<ServerPage> createState() => _ServerPageState();
}
class _ServerPageState extends State<ServerPage> {
final StreamController _controller = StreamController.broadcast();
ServerPage({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
StreamBuilder(
stream: _controller.stream,
builder: (context, snapshot) => HostInput(
controller: widget.hostController,
localController: widget.localController)),
StreamBuilder(
stream: _controller.stream,
builder: (context, snapshot) => PortInput(
controller: widget.portController,
localController: widget.localController)),
LocalServerSwitch(
controller: widget.localController,
onSelected: (_) => _controller.add(null)),
ServerButton(
localController: widget.localController,
portController: widget.portController,
hostController: widget.hostController,
serverController: widget.serverController,
startController: widget.startedServerController)
]);
return Obx(() => Column(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
if (_warningController.warning.value) const RestartWarning(),
HostInput(),
PortInput(),
LocalServerSwitch(),
ServerButton()
]));
}
}