refactor(legacy-account): move change_password local error to provider (no setState)

This commit is contained in:
2026-04-22 00:10:43 +02:00
parent 75b47e2c25
commit 69fdc2233f
3 changed files with 81 additions and 8 deletions

View File

@@ -1,5 +1,6 @@
import 'package:account/src/features/change_password/domain/password_validator.dart';
import 'package:account/src/features/change_password/presentation/providers/change_password_controller.dart';
import 'package:account/src/features/change_password/presentation/providers/change_password_local_error_provider.dart';
import 'package:account/src/features/change_password/presentation/providers/change_password_visibility_provider.dart';
import 'package:design_system/design_system.dart';
import 'package:flutter/material.dart';
@@ -24,7 +25,6 @@ class ChangePasswordScreen extends ConsumerStatefulWidget {
class _ChangePasswordScreenState extends ConsumerState<ChangePasswordScreen> {
late final TextEditingController _newPasswordController;
late final TextEditingController _repeatPasswordController;
String? _localError;
@override
void initState() {
@@ -45,11 +45,8 @@ class _ChangePasswordScreenState extends ConsumerState<ChangePasswordScreen> {
password: _newPasswordController.text,
repeat: _repeatPasswordController.text,
);
if (error != null) {
setState(() => _localError = error);
return;
}
setState(() => _localError = null);
ref.read(changePasswordLocalErrorProvider.notifier).set(error);
if (error != null) return;
ref
.read(changePasswordControllerProvider.notifier)
.submit(password: _newPasswordController.text.trim());
@@ -71,6 +68,7 @@ class _ChangePasswordScreenState extends ConsumerState<ChangePasswordScreen> {
final isLoading = ref.watch(
changePasswordControllerProvider.select((s) => s.isLoading),
);
final localError = ref.watch(changePasswordLocalErrorProvider);
return LegacyPageLayout(
title: context.translate(I18n.changePassword),
@@ -91,11 +89,11 @@ class _ChangePasswordScreenState extends ConsumerState<ChangePasswordScreen> {
newController: _newPasswordController,
repeatController: _repeatPasswordController,
),
if (_localError != null)
if (localError != null)
Padding(
padding: const EdgeInsets.only(top: 8),
child: Text(
context.translate(_localError!),
context.translate(localError),
textAlign: TextAlign.center,
style: TextStyle(
color: Theme.of(context).colorScheme.error,

View File

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

View File

@@ -0,0 +1,64 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'change_password_local_error_provider.dart';
// **************************************************************************
// RiverpodGenerator
// **************************************************************************
// GENERATED CODE - DO NOT MODIFY BY HAND
// ignore_for_file: type=lint, type=warning
@ProviderFor(ChangePasswordLocalError)
const changePasswordLocalErrorProvider = ChangePasswordLocalErrorProvider._();
final class ChangePasswordLocalErrorProvider
extends $NotifierProvider<ChangePasswordLocalError, String?> {
const ChangePasswordLocalErrorProvider._()
: super(
from: null,
argument: null,
retry: null,
name: r'changePasswordLocalErrorProvider',
isAutoDispose: true,
dependencies: null,
$allTransitiveDependencies: null,
);
@override
String debugGetCreateSourceHash() => _$changePasswordLocalErrorHash();
@$internal
@override
ChangePasswordLocalError create() => ChangePasswordLocalError();
/// {@macro riverpod.override_with_value}
Override overrideWithValue(String? value) {
return $ProviderOverride(
origin: this,
providerOverride: $SyncValueProvider<String?>(value),
);
}
}
String _$changePasswordLocalErrorHash() =>
r'a8cc23f326988bbdc13b058e055daaa8c684a8c8';
abstract class _$ChangePasswordLocalError 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);
}
}