Skip to content
This repository has been archived by the owner on Jun 28, 2023. It is now read-only.

Commit

Permalink
Bug fix:instance settings are broken when instances loading error
Browse files Browse the repository at this point in the history
錯誤修復:載入安裝檔時遇到錯誤會破壞安裝檔設定
  • Loading branch information
SiongSng committed Dec 26, 2021
1 parent 3312948 commit 01118f2
Show file tree
Hide file tree
Showing 11 changed files with 100 additions and 80 deletions.
2 changes: 1 addition & 1 deletion lib/Launcher/InstanceRepository.dart
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ class InstanceRepository {
return File(join(getInstanceDir(instanceUUID).path, "instance.json"));
}

static InstanceConfig instanceConfig(String instanceUUID) {
static InstanceConfig? instanceConfig(String instanceUUID) {
return InstanceConfig.fromFile(instanceConfigFile(instanceUUID));
}

Expand Down
77 changes: 52 additions & 25 deletions lib/Model/Game/Instance.dart
Original file line number Diff line number Diff line change
Expand Up @@ -75,9 +75,28 @@ class Instance {
width: 64,
height: 64,
);
} else if (config.loaderEnum == ModLoader.unknown) {
_widget = Stack(
alignment: Alignment.center,
children: [
_widget,
Positioned(
child: Icon(Icons.error_sharp, size: 30, color: Colors.red),
right: 2,
top: 2,
)
],
);
}

return _widget;
return ClipRRect(
borderRadius: BorderRadius.circular(25),
child: SizedBox(
child: _widget,
width: 150,
height: 150,
),
);
}

Instance(this.uuid, this.config);
Expand Down Expand Up @@ -204,7 +223,7 @@ class Instance {
await copyPath(path, InstanceRepository.getInstanceDir(uuid).path);

InstanceConfig newInstanceConfig =
InstanceRepository.instanceConfig(uuid);
InstanceRepository.instanceConfig(uuid)!;

newInstanceConfig.storage['uuid'] = uuid;
newInstanceConfig.name =
Expand Down Expand Up @@ -398,11 +417,11 @@ class InstanceConfig {
name: name,
side: MinecraftSide.client,
loader: ModLoader.unknown.name,
version: "1.17.1",
version: "1.18.1",
javaVersion: 16,
libraries: Libraries.fromList([]),
uuid: name,
assetsID: "1.17",
assetsID: "1.18",
);
}

Expand All @@ -412,10 +431,23 @@ class InstanceConfig {
InstanceRepository.instanceConfigFile(instanceUUID));
}

static InstanceConfig fromFile(File file) {
static InstanceConfig? fromFile(File file) {
late InstanceConfig _config;
try {
Map _data = json.decode(file.readAsStringSync());
String source;
try {
source = file.readAsStringSync();
} catch (e) {
if (e is FileSystemException) {
/// 當遇到檔案錯誤時將跳過載入,回傳空的安裝檔
return null;
} else {
/// 如果是其他錯誤將重新拋出錯誤交給上層例外處理
rethrow;
}
}

Map _data = json.decode(source);

_config = InstanceConfig(
name: _data['name'],
Expand All @@ -434,35 +466,30 @@ class InstanceConfig {
assetsID: _data['assets_id'] ?? _data['version'],
);
} catch (e, stackTrace) {
logger.error(ErrorType.instance, e, stackTrace: stackTrace);
_config = InstanceConfig.unknown(file);

try {
_config.storage.setItem("error", {
/// 新增安裝檔錯誤資訊
"stack_trace": stackTrace.toString(),
"message": e.toString(),
"source_instance_config": file.readAsStringSync()
});
} catch (e) {}

if (e is FileSystemException && e.message == "Cannot open file") {
return _config;
}

if (e is! FileSystemException) {
logger.error(ErrorType.instance, e, stackTrace: stackTrace);
Future.delayed(Duration.zero, () {
showDialog(
context: navigator.context,
builder: (context) => AlertDialog(
title:
I18nText("gui.error.info", textAlign: TextAlign.center),
content: I18nText("instance.error.format",
args: {"error": e.toString()},
textAlign: TextAlign.center),
actions: [OkClose()],
));
});
}
Future.delayed(Duration.zero, () {
showDialog(
context: navigator.context,
builder: (context) => AlertDialog(
title:
I18nText("gui.error.info", textAlign: TextAlign.center),
content: I18nText("instance.error.format",
args: {"error": e.toString()},
textAlign: TextAlign.center),
actions: [OkClose()],
));
});
}
return _config;
}
Expand Down
17 changes: 8 additions & 9 deletions lib/Screen/CheckAssets.dart
Original file line number Diff line number Diff line change
Expand Up @@ -11,6 +11,7 @@ import 'package:rpmlauncher/Launcher/CheckData.dart';
import 'package:rpmlauncher/Launcher/InstanceRepository.dart';
import 'package:rpmlauncher/Model/Game/Instance.dart';
import 'package:rpmlauncher/Model/Game/MinecraftMeta.dart';
import 'package:rpmlauncher/Model/Game/MinecraftSide.dart';
import 'package:rpmlauncher/Utility/Config.dart';
import 'package:rpmlauncher/Utility/I18n.dart';
import 'package:rpmlauncher/Utility/RPMHttpClient.dart';
Expand All @@ -20,28 +21,26 @@ import 'package:rpmlauncher/Utility/Data.dart';
class _CheckAssetsScreenState extends State<CheckAssetsScreen> {
double checkAssetsProgress = 0.0;
bool checkAssets = Config.getValue("check_assets");

late InstanceConfig instanceConfig;
@override
void initState() {
super.initState();

if (checkAssets) {
instanceConfig =
InstanceRepository.instanceConfig(basename(widget.instanceDir.path))!;

if (checkAssets && instanceConfig.sideEnum.isClient) {
//是否檢查資源檔案完整性
thread();
} else {
checkAssetsProgress = 1.0;
}

super.initState();
}

thread() async {
ReceivePort port = ReceivePort();
compute(instanceAssets, [
port.sendPort,
InstanceRepository.instanceConfig(basename(widget.instanceDir.path)),
dataHome
]).then((value) {
compute(instanceAssets, [port.sendPort, instanceConfig, dataHome])
.then((value) {
if (mounted) {
setState(() {
checkAssetsProgress = 1.0;
Expand Down
4 changes: 2 additions & 2 deletions lib/Screen/CurseForgeMod.dart
Original file line number Diff line number Diff line change
Expand Up @@ -20,8 +20,7 @@ class _CurseForgeModState extends State<CurseForgeMod> {
int index = 20;

Directory get modDir => InstanceRepository.getModRootDir(widget.instanceUUID);
InstanceConfig get instanceConfig =>
InstanceRepository.instanceConfig(widget.instanceUUID);
late InstanceConfig instanceConfig;
List<String> sortItems = [
I18n.format("edit.instance.mods.sort.curseforge.featured"),
I18n.format("edit.instance.mods.sort.curseforge.popularity"),
Expand All @@ -37,6 +36,7 @@ class _CurseForgeModState extends State<CurseForgeMod> {
void initState() {
searchController = TextEditingController();
modScrollController = ScrollController();
instanceConfig = InstanceRepository.instanceConfig(widget.instanceUUID)!;

super.initState();

Expand Down
2 changes: 1 addition & 1 deletion lib/Screen/DownloadCurseModPack.dart
Original file line number Diff line number Diff line change
Expand Up @@ -198,7 +198,7 @@ class _TaskState extends State<Task> {
instanceUUID: uuid,
packMeta: widget.packMeta,
packArchive: widget.packArchive),
allJavaVersions: Instance.fromUUID(uuid)!.config.needJavaVersion);
allJavaVersions: config.needJavaVersion);
});
}

Expand Down
5 changes: 1 addition & 4 deletions lib/Screen/Edit.dart
Original file line number Diff line number Diff line change
Expand Up @@ -133,10 +133,7 @@ class _EditInstanceState extends State<EditInstance> {
return [
ListView(
children: [
SizedBox(
height: 150,
child: instance.imageWidget,
),
instance.imageWidget,
SizedBox(
height: 12,
),
Expand Down
23 changes: 0 additions & 23 deletions lib/Screen/HomePage.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,6 @@ import 'package:rpmlauncher/Route/PushTransitions.dart';
import 'package:rpmlauncher/Screen/About.dart';
import 'package:rpmlauncher/Screen/Settings.dart';
import 'package:rpmlauncher/Screen/VersionSelection.dart';
import 'package:rpmlauncher/Utility/Config.dart';
import 'package:rpmlauncher/Utility/Data.dart';
import 'package:rpmlauncher/Utility/I18n.dart';
import 'package:rpmlauncher/Utility/LauncherInfo.dart';
Expand All @@ -20,7 +19,6 @@ import 'package:rpmlauncher/View/InstanceView.dart';
import 'package:rpmlauncher/View/MinecraftNewsView.dart';
import 'package:rpmlauncher/View/RowScrollView.dart';
import 'package:rpmlauncher/Widget/AccountManageAction.dart';
import 'package:rpmlauncher/Widget/Dialog/QuickSetup.dart';
import 'package:rpmlauncher/Widget/Dialog/UpdaterDialog.dart';
import 'package:rpmlauncher/Widget/RPMTW-Design/NewFeaturesWidget.dart';
import 'package:rpmlauncher/Widget/RPMTW-Design/OkClose.dart';
Expand All @@ -38,27 +36,6 @@ class HomePage extends StatefulWidget {
}

class _HomePageState extends State<HomePage> {
@override
void initState() {
super.initState();
WidgetsBinding.instance!.addPostFrameCallback((timeStamp) {
if (Config.getValue('init') == false && mounted) {
showDialog(
context: context,
barrierDismissible: false,
builder: (context) => QuickSetup());
} else {
Updater.checkForUpdate(Updater.fromConfig()).then((VersionInfo info) {
if (info.needUpdate && mounted) {
showDialog(
context: navigator.context,
builder: (context) => UpdaterDialog(info: info));
}
});
}
});
}

@override
Widget build(BuildContext context) {
return DefaultTabController(
Expand Down
25 changes: 25 additions & 0 deletions lib/Screen/LauncherHome.dart
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ import 'package:flutter/services.dart';
import 'package:no_context_navigation/no_context_navigation.dart';
import 'package:provider/provider.dart';
import 'package:rpmlauncher/Function/Counter.dart';
import 'package:rpmlauncher/Utility/Config.dart';
import 'package:rpmlauncher/Utility/Data.dart';

import 'package:rpmlauncher/Route/GenerateRoute.dart';
Expand All @@ -18,6 +19,9 @@ import 'package:rpmlauncher/Utility/LauncherInfo.dart';
import 'package:rpmlauncher/Utility/RPMFeedbackLocalizations.dart';
import 'package:rpmlauncher/Utility/Theme.dart';
import 'package:rpmlauncher/Route/RPMNavigatorObserver.dart';
import 'package:rpmlauncher/Utility/Updater.dart';
import 'package:rpmlauncher/Widget/Dialog/QuickSetup.dart';
import 'package:rpmlauncher/Widget/Dialog/UpdaterDialog.dart';
import 'package:rpmlauncher/Widget/RPMTW-Design/OkClose.dart';
import 'package:sentry_flutter/sentry_flutter.dart';

Expand All @@ -27,6 +31,27 @@ class LauncherHome extends StatefulWidget {
}

class _LauncherHomeState extends State<LauncherHome> {
@override
void initState() {
super.initState();
WidgetsBinding.instance!.addPostFrameCallback((timeStamp) {
if (Config.getValue('init') == false && mounted) {
showDialog(
context: context,
barrierDismissible: false,
builder: (context) => QuickSetup());
} else {
Updater.checkForUpdate(Updater.fromConfig()).then((VersionInfo info) {
if (info.needUpdate && mounted) {
showDialog(
context: navigator.context,
builder: (context) => UpdaterDialog(info: info));
}
});
}
});
}

@override
Widget build(BuildContext context) {
return Provider(
Expand Down
2 changes: 1 addition & 1 deletion lib/Screen/Log.dart
Original file line number Diff line number Diff line change
Expand Up @@ -73,7 +73,7 @@ class _LogScreenState extends State<LogScreen> {
super.initState();

instanceDir = InstanceRepository.getInstanceDir(widget.instanceUUID);
instanceConfig = InstanceRepository.instanceConfig(widget.instanceUUID);
instanceConfig = InstanceRepository.instanceConfig(widget.instanceUUID)!;

setWindowTitle("RPMLauncher - ${instanceConfig.name}");

Expand Down
8 changes: 5 additions & 3 deletions lib/Screen/ModrinthMod.dart
Original file line number Diff line number Diff line change
Expand Up @@ -12,8 +12,7 @@ import 'package:rpmlauncher/Widget/RWLLoading.dart';
class _ModrinthModState extends State<ModrinthMod> {
TextEditingController searchController = TextEditingController();
late Directory modDir = InstanceRepository.getModRootDir(widget.instanceUUID);
late InstanceConfig instanceConfig =
InstanceRepository.instanceConfig(widget.instanceUUID);
late InstanceConfig instanceConfig;

late List beforeModList = [];
late int index = 0;
Expand All @@ -31,14 +30,17 @@ class _ModrinthModState extends State<ModrinthMod> {

@override
void initState() {
instanceConfig = InstanceRepository.instanceConfig(widget.instanceUUID)!;

super.initState();

modScrollController.addListener(() {
if (modScrollController.position.maxScrollExtent ==
modScrollController.position.pixels) {
//如果滑動到底部
setState(() {});
}
});
super.initState();
}

@override
Expand Down
15 changes: 4 additions & 11 deletions lib/View/InstanceView.dart
Original file line number Diff line number Diff line change
Expand Up @@ -56,9 +56,9 @@ class _InstanceViewState extends State<InstanceView> {
if (dir is Directory) {
List<FileSystemEntity> _files = await dir.list().toList();
if (_files.any((file) => basename(file.path) == "instance.json")) {
Instance instance =
Instance.fromUUID(InstanceRepository.getUUIDByDir(dir))!;
if (instance.config.sideEnum == widget.side) {
Instance? instance =
Instance.fromUUID(InstanceRepository.getUUIDByDir(dir));
if (instance != null && instance.config.sideEnum == widget.side) {
instances.add(instance);
}
}
Expand Down Expand Up @@ -193,14 +193,7 @@ class _InstanceViewState extends State<InstanceView> {
SizedBox(
height: 10,
),
ClipRRect(
borderRadius: BorderRadius.circular(25),
child: SizedBox(
child: instance.imageWidget,
width: 150,
height: 150,
),
),
instance.imageWidget,
Text(instance.name,
textAlign: TextAlign.center),
SizedBox(height: 12),
Expand Down

0 comments on commit 01118f2

Please sign in to comment.