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
@@ -50,7 +50,7 @@ final class AddonDetailsProvider
}
}
String _$addonDetailsHash() => r'26b4a33e9d17aced1d3fb5c6ff28921f611ca5b0';
String _$addonDetailsHash() => r'b8b7b0620d618488227fb6b8ba889279b933b707';
final class AddonDetailsFamily extends $Family
with
@@ -658,7 +658,7 @@ final class AddonUpdateCheckProvider
}
}
String _$addonUpdateCheckHash() => r'4ef375b5cd9b0eb89fbbdaff3f93a35482191af5';
String _$addonUpdateCheckHash() => r'496cf9756101c9c36fa4b90f1fd92627aee92177';
final class AddonUpdateCheckFamily extends $Family
with
@@ -739,7 +739,7 @@ final class AddonListProvider
AddonList create() => AddonList();
}
String _$addonListHash() => r'7625b69a433d073e186571453e39b557d8b48a5d';
String _$addonListHash() => r'1e60b0b04702e6ed6143ccf19d9e4140d1a1deec';
abstract class _$AddonList extends $AsyncNotifier<List<AddonInfo>> {
FutureOr<List<AddonInfo>> build();
@@ -791,7 +791,7 @@ final class AddonBusyIdsProvider
}
}
String _$addonBusyIdsHash() => r'6f9761320d42b2b5132936797617fdb13b718dd3';
String _$addonBusyIdsHash() => r'aac8fd8784ba296129ffdb17c2d1355c1546140f';
abstract class _$AddonBusyIds extends $Notifier<Set<String>> {
Set<String> build();
@@ -895,7 +895,7 @@ final class BulkAddonUpdateProvider
}
}
String _$bulkAddonUpdateHash() => r'2605711734f9eb6af70e721a4337556a7ea85512';
String _$bulkAddonUpdateHash() => r'ec3cdc136c0ad4a6687516bf14912fd5b96b11b4';
abstract class _$BulkAddonUpdate extends $Notifier<AsyncValue<void>> {
AsyncValue<void> build();