refactor(legacy-settings): move language selection state to provider (no setState)
This commit is contained in:
@@ -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
|
||||
|
||||
@@ -34,7 +34,7 @@ final class LanguageControllerProvider
|
||||
}
|
||||
|
||||
String _$languageControllerHash() =>
|
||||
r'54d18f53bea0cdb8f7346cf66d4c1e190cfd7d75';
|
||||
r'b34791c28274cfb33d9f116788574e7e9aeaa818';
|
||||
|
||||
abstract class _$LanguageController extends $AsyncNotifier<void> {
|
||||
FutureOr<void> build();
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user