refactor(legacy-settings): move language selection state to provider (no setState)

This commit is contained in:
2026-04-22 00:00:14 +02:00
parent 1c0a8b7bb7
commit 75b47e2c25
4 changed files with 84 additions and 13 deletions

View File

@@ -6,6 +6,7 @@ import 'package:legacy_theme/legacy_theme.dart';
import 'package:legacy_ui/legacy_ui.dart';
import 'package:navigation/navigation.dart';
import 'package:settings/src/features/language/presentation/providers/language_controller.dart';
import 'package:settings/src/features/language/presentation/providers/language_selection_provider.dart';
import 'package:sf_localizations/sf_localizations.dart';
import 'package:sf_shared/sf_shared.dart';
@@ -18,20 +19,13 @@ const _languageOptions = <String, String>{
'de': 'Deutsch',
};
class LanguageScreen extends ConsumerStatefulWidget {
class LanguageScreen extends ConsumerWidget {
final NavigationContract navigationContract;
const LanguageScreen({super.key, required this.navigationContract});
@override
ConsumerState<LanguageScreen> createState() => _LanguageScreenState();
}
class _LanguageScreenState extends ConsumerState<LanguageScreen> {
String? _selectedLanguage;
@override
Widget build(BuildContext context) {
Widget build(BuildContext context, WidgetRef ref) {
ref.listen(languageControllerProvider, (prev, next) async {
next.showErrorOn(context);
if (prev != null &&
@@ -39,13 +33,14 @@ class _LanguageScreenState extends ConsumerState<LanguageScreen> {
!next.isLoading &&
!next.hasError) {
await showSuccessDialog(context, I18n.deviceUpdatedSuccess);
if (context.mounted) widget.navigationContract.goBack();
if (context.mounted) navigationContract.goBack();
}
});
final device = ref.watch(selectedDeviceProvider).value;
final currentLanguage = device?.settings.language ?? 'es';
final selectedLanguage = _selectedLanguage ?? currentLanguage;
final selectedLanguage =
ref.watch(languageSelectionProvider) ?? currentLanguage;
final isLoading = ref.watch(
languageControllerProvider.select((s) => s.isLoading),
);
@@ -56,7 +51,9 @@ class _LanguageScreenState extends ConsumerState<LanguageScreen> {
child: RadioGroup(
groupValue: selectedLanguage,
onChanged: (value) {
if (value != null) setState(() => _selectedLanguage = value);
if (value != null) {
ref.read(languageSelectionProvider.notifier).select(value);
}
},
child: Column(
children: _languageOptions.entries

View File

@@ -34,7 +34,7 @@ final class LanguageControllerProvider
}
String _$languageControllerHash() =>
r'54d18f53bea0cdb8f7346cf66d4c1e190cfd7d75';
r'b34791c28274cfb33d9f116788574e7e9aeaa818';
abstract class _$LanguageController extends $AsyncNotifier<void> {
FutureOr<void> build();

View File

@@ -0,0 +1,11 @@
import 'package:riverpod_annotation/riverpod_annotation.dart';
part 'language_selection_provider.g.dart';
@riverpod
class LanguageSelection extends _$LanguageSelection {
@override
String? build() => null;
void select(String value) => state = value;
}

View File

@@ -0,0 +1,63 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'language_selection_provider.dart';
// **************************************************************************
// RiverpodGenerator
// **************************************************************************
// GENERATED CODE - DO NOT MODIFY BY HAND
// ignore_for_file: type=lint, type=warning
@ProviderFor(LanguageSelection)
const languageSelectionProvider = LanguageSelectionProvider._();
final class LanguageSelectionProvider
extends $NotifierProvider<LanguageSelection, String?> {
const LanguageSelectionProvider._()
: super(
from: null,
argument: null,
retry: null,
name: r'languageSelectionProvider',
isAutoDispose: true,
dependencies: null,
$allTransitiveDependencies: null,
);
@override
String debugGetCreateSourceHash() => _$languageSelectionHash();
@$internal
@override
LanguageSelection create() => LanguageSelection();
/// {@macro riverpod.override_with_value}
Override overrideWithValue(String? value) {
return $ProviderOverride(
origin: this,
providerOverride: $SyncValueProvider<String?>(value),
);
}
}
String _$languageSelectionHash() => r'0921d5dd3856c13e55ab5d0836cde0fe9a6494df';
abstract class _$LanguageSelection extends $Notifier<String?> {
String? build();
@$mustCallSuper
@override
void runBuild() {
final created = build();
final ref = this.ref as $Ref<String?, String?>;
final element =
ref.element
as $ClassProviderElement<
AnyNotifier<String?, String?>,
String?,
Object?,
Object?
>;
element.handleValue(ref, created);
}
}