select method

Future<void> select(
  1. String value
)

Implementation

Future<void> select(String value) async {
  final current = state.value;
  if (current == null ||
      !current.enabled ||
      _saving ||
      current.isSaving ||
      value == current.value) {
    return;
  }
  final version = ++_requestVersion;
  _saving = true;
  state = AsyncData(current.copyWith(isSaving: true, clearError: true));

  try {
    switch (_id) {
      case .language:
        await ref.read(languageRepositoryProvider).select(value);
      case .themeMode:
        await ref
            .read(preferencesRepositoryProvider)
            .set(PrefKey.themeMode, value);
    }
    final next = await _readCurrent();
    if (ref.mounted && version == _requestVersion) {
      state = AsyncData(next);
    }
  } catch (_) {
    if (ref.mounted && version == _requestVersion) {
      state = AsyncData(
        current.copyWith(
          isSaving: false,
          error: PreferenceDetailError.save,
        ),
      );
    }
  } finally {
    _saving = false;
    final latest = state.value;
    if (ref.mounted &&
        version == _requestVersion &&
        latest?.isSaving == true &&
        latest?.error == null) {
      state = AsyncData(latest!.copyWith(isSaving: false));
    }
  }
}