From 75b47e2c25b87c7b453bf31402e4938bfbb46363 Mon Sep 17 00:00:00 2001 From: JulianAlcala Date: Wed, 22 Apr 2026 00:00:14 +0200 Subject: [PATCH] refactor(legacy-settings): move language selection state to provider (no setState) --- .../presentation/language_screen.dart | 21 +++---- .../providers/language_controller.g.dart | 2 +- .../language_selection_provider.dart | 11 ++++ .../language_selection_provider.g.dart | 63 +++++++++++++++++++ 4 files changed, 84 insertions(+), 13 deletions(-) create mode 100644 modules/legacy/modules/settings/lib/src/features/language/presentation/providers/language_selection_provider.dart create mode 100644 modules/legacy/modules/settings/lib/src/features/language/presentation/providers/language_selection_provider.g.dart diff --git a/modules/legacy/modules/settings/lib/src/features/language/presentation/language_screen.dart b/modules/legacy/modules/settings/lib/src/features/language/presentation/language_screen.dart index 0fdf796f..0ee4ed57 100644 --- a/modules/legacy/modules/settings/lib/src/features/language/presentation/language_screen.dart +++ b/modules/legacy/modules/settings/lib/src/features/language/presentation/language_screen.dart @@ -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 = { 'de': 'Deutsch', }; -class LanguageScreen extends ConsumerStatefulWidget { +class LanguageScreen extends ConsumerWidget { final NavigationContract navigationContract; const LanguageScreen({super.key, required this.navigationContract}); @override - ConsumerState createState() => _LanguageScreenState(); -} - -class _LanguageScreenState extends ConsumerState { - 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 { !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 { 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 diff --git a/modules/legacy/modules/settings/lib/src/features/language/presentation/providers/language_controller.g.dart b/modules/legacy/modules/settings/lib/src/features/language/presentation/providers/language_controller.g.dart index 43ec1cc9..afca9b19 100644 --- a/modules/legacy/modules/settings/lib/src/features/language/presentation/providers/language_controller.g.dart +++ b/modules/legacy/modules/settings/lib/src/features/language/presentation/providers/language_controller.g.dart @@ -34,7 +34,7 @@ final class LanguageControllerProvider } String _$languageControllerHash() => - r'54d18f53bea0cdb8f7346cf66d4c1e190cfd7d75'; + r'b34791c28274cfb33d9f116788574e7e9aeaa818'; abstract class _$LanguageController extends $AsyncNotifier { FutureOr build(); diff --git a/modules/legacy/modules/settings/lib/src/features/language/presentation/providers/language_selection_provider.dart b/modules/legacy/modules/settings/lib/src/features/language/presentation/providers/language_selection_provider.dart new file mode 100644 index 00000000..8fc41a9e --- /dev/null +++ b/modules/legacy/modules/settings/lib/src/features/language/presentation/providers/language_selection_provider.dart @@ -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; +} diff --git a/modules/legacy/modules/settings/lib/src/features/language/presentation/providers/language_selection_provider.g.dart b/modules/legacy/modules/settings/lib/src/features/language/presentation/providers/language_selection_provider.g.dart new file mode 100644 index 00000000..5d9caa82 --- /dev/null +++ b/modules/legacy/modules/settings/lib/src/features/language/presentation/providers/language_selection_provider.g.dart @@ -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 { + 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(value), + ); + } +} + +String _$languageSelectionHash() => r'0921d5dd3856c13e55ab5d0836cde0fe9a6494df'; + +abstract class _$LanguageSelection extends $Notifier { + String? build(); + @$mustCallSuper + @override + void runBuild() { + final created = build(); + final ref = this.ref as $Ref; + final element = + ref.element + as $ClassProviderElement< + AnyNotifier, + String?, + Object?, + Object? + >; + element.handleValue(ref, created); + } +}