provider lifecycle hardenings

This commit is contained in:
Fabian Freund
2026-05-06 18:32:45 +02:00
parent d5f977a3d2
commit fee15cb8d2
25 changed files with 246 additions and 94 deletions
@@ -80,7 +80,14 @@ class AddonDetails extends _$AddonDetails {
Future<void> _run(Future<AddonInfo?> Function() action) async {
state = const AsyncLoading<AddonInfo?>();
state = await AsyncValue.guard(action);
final result = await AsyncValue.guard(action);
if (!ref.mounted) {
return;
}
state = result;
ref.invalidate(addonListProvider);
}
@@ -239,6 +246,10 @@ class AddonUpdateCheck extends _$AddonUpdateCheck {
: AddonUpdateRunDone(attempt?.message);
});
if (!ref.mounted) {
return result.value ?? const AddonUpdateRunFailed();
}
state = result;
ref.invalidate(addonDetailsProvider(addonId));
ref.invalidate(lastAddonUpdateAttemptProvider(addonId));
@@ -261,26 +272,40 @@ class AddonList extends _$AddonList {
}
Future<void> install(AddonInfo addon) async {
ref.read(addonBusyIdsProvider.notifier).add(addon.id);
final busyIds = ref.read(addonBusyIdsProvider.notifier);
busyIds.add(addon.id);
try {
await _service.installAddon(Uri.parse(addon.downloadUrl));
if (!ref.mounted) {
return;
}
ref.invalidate(addonDetailsProvider(addon.id));
ref.invalidateSelf();
await future;
} finally {
ref.read(addonBusyIdsProvider.notifier).remove(addon.id);
busyIds.remove(addon.id);
}
}
Future<void> uninstall(AddonInfo addon) async {
ref.read(addonBusyIdsProvider.notifier).add(addon.id);
final busyIds = ref.read(addonBusyIdsProvider.notifier);
busyIds.add(addon.id);
try {
await _service.uninstallAddon(addon.id);
if (!ref.mounted) {
return;
}
ref.invalidate(addonDetailsProvider(addon.id));
ref.invalidateSelf();
await future;
} finally {
ref.read(addonBusyIdsProvider.notifier).remove(addon.id);
busyIds.remove(addon.id);
}
}
@@ -292,8 +317,15 @@ class AddonList extends _$AddonList {
@Riverpod()
class AddonBusyIds extends _$AddonBusyIds {
void add(String id) => state = {...state, id};
void remove(String id) => state = {...state}..remove(id);
void add(String id) {
if (!ref.mounted) return;
state = {...state, id};
}
void remove(String id) {
if (!ref.mounted) return;
state = {...state}..remove(id);
}
@override
Set<String> build() => const {};
@@ -329,9 +361,16 @@ class PinnedAddonIds extends _$PinnedAddonIds {
class BulkAddonUpdate extends _$BulkAddonUpdate {
Future<void> triggerAll() async {
state = const AsyncLoading();
state = await AsyncValue.guard(() async {
final result = await AsyncValue.guard(() async {
await ref.read(addonServiceProvider).triggerAllAddonUpdates();
});
if (!ref.mounted) {
return;
}
state = result;
}
@override