feat(apps): 重构 UI 架构为 presentation 层并新增 l10n 国际化支持

This commit is contained in:
qzl
2026-03-27 14:05:03 +08:00
parent b1f0eb8921
commit c592cc7854
178 changed files with 10748 additions and 5764 deletions
+56
View File
@@ -0,0 +1,56 @@
import 'package:formz/formz.dart';
import '../../core/l10n/l10n.dart';
class Username extends FormzInput<String, String> {
const Username.pure() : super.pure('');
const Username.dirty([super.value = '']) : super.dirty();
@override
String? validator(String value) {
if (value.isEmpty) return L10n.current.inputUsernameRequired;
if (value.length < 3) return L10n.current.inputUsernameMin;
if (value.length > 30) return L10n.current.inputUsernameMax;
return null;
}
}
class Phone extends FormzInput<String, String> {
const Phone.pure() : super.pure('');
const Phone.dirty([super.value = '']) : super.dirty();
static final _regex = RegExp(r'^\d{7,14}$');
@override
String? validator(String value) {
final normalized = value.replaceAll(RegExp(r'\s+'), '');
if (normalized.isEmpty) return L10n.current.inputPhoneRequired;
if (!_regex.hasMatch(normalized)) return L10n.current.inputPhoneInvalid;
return null;
}
}
class Password extends FormzInput<String, String> {
const Password.pure() : super.pure('');
const Password.dirty([super.value = '']) : super.dirty();
@override
String? validator(String value) {
if (value.isEmpty) return L10n.current.inputPasswordRequired;
if (value.length < 6) return L10n.current.inputPasswordMin;
return null;
}
}
class VerificationCode extends FormzInput<String, String> {
const VerificationCode.pure() : super.pure('');
const VerificationCode.dirty([super.value = '']) : super.dirty();
@override
String? validator(String value) {
if (value.isEmpty) return L10n.current.inputCodeRequired;
if (!RegExp(r'^\d{6}$').hasMatch(value)) {
return L10n.current.inputCodeInvalid;
}
return null;
}
}