#flutter #dart #textformfield
#flutter #dart #textformfield
Вопрос:
У меня есть валидаторы для пары TextFormFields, но если я пишу валидаторы в том же классе, я могу восстановить его, но если запись выполняется в отдельном классе, я просто не могу его инициализировать, поскольку он не отображается.
То, что я сделал на данный момент :
class _RegistrationPageState extends State<RegistrationPage> {
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: LightColors.kAqua,
body: SingleChildScrollView(
child: Padding(
padding: const EdgeInsets.only(top: 32.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
TextFormField(
validator: validateEmail,
controller: emailController,
onChanged: (val){
setState(() => email = val);
},
decoration: InputDecoration(
prefixIcon: Icon(Icons.email),
hintText: "Email",
hintStyle: TextStyle(color: Colors.grey),
border: InputBorder.none),
),
]
)
)
)
);
}
String validateEmail(String value){
String pattern = r'(^[a-z,A-Z ]*$)';
RegExp regExp = new RegExp(pattern);
if (!regExp.hasMatch(value)) {
return "Name must be a-z and A-Z";
}
return null;
}
}
Используя это, я могу получить validateEmail в поле validator, но если я просто напишу тот же validateEmail в отдельный класс, я не смогу его получить.
class Validators {
String validateEmail(String value){
String pattern = r'(^[a-z,A-Z ]*$)';
RegExp regExp = new RegExp(pattern);
if (!regExp.hasMatch(value)) {
return "Name must be a-z and A-Z";
}
return null;
}
}
Комментарии:
1.
static String validateEmail
и используйте егоvalidator: Validators.validateEmail,
, но вы также можете определить их как функции верхнего уровня (они не обязательно должны быть внутри какого-либо класса)2. Да! отлично, спасибо
3. конечно, ваше приветствие
Ответ №1:
Если вы хотите использовать свою функцию валидатора по всему проекту. Просто вставьте его за пределы класса и используйте где угодно, или вы также можете создать новый файл и вставить туда функцию и использовать их в другом файле При таком подходе не забудьте импортировать файл. (используйте ctrl . по имени функции для импорта файла компилятор автоматически находит файл и импортирует его)
Этот тип функции называется функцией верхнего уровня.
class _RegistrationPageState extends State<RegistrationPage> {
@override
Widget build(BuildContext context) {
return Scaffold(
backgroundColor: LightColors.kAqua,
body: SingleChildScrollView(
child: Padding(
padding: const EdgeInsets.only(top: 32.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
TextFormField(
validator: validateEmail,
controller: emailController,
onChanged: (val){
setState(() => email = val);
},
decoration: InputDecoration(
prefixIcon: Icon(Icons.email),
hintText: "Email",
hintStyle: TextStyle(color: Colors.grey),
border: InputBorder.none),
),
]
)
)
)
);
}
}
String validateEmail(String value){
String pattern = r'(^[a-z,A-Z ]*$)';
RegExp regExp = new RegExp(pattern);
if (!regExp.hasMatch(value)) {
return "Name must be a-z and A-Z";
}
return null;
}
или
Если вы хотите использовать эти функции внутри класса. затем сначала создайте экземпляр и вызовите функцию.
Ответ №2:
Вы можете скопировать вставить запустить полный код ниже
Вы можете использовать validator: Validators().validateEmail
фрагмент кода
TextFormField(
validator: Validators().validateEmail,
рабочая демонстрация
полный код
import 'package:flutter/material.dart';
class RegistrationPage extends StatefulWidget {
@override
_RegistrationPageState createState() => _RegistrationPageState();
}
class _RegistrationPageState extends State<RegistrationPage> {
TextEditingController emailController = TextEditingController();
String email;
final _formKey = GlobalKey<FormState>();
@override
Widget build(BuildContext context) {
return Scaffold(
//backgroundColor: LightColors.kAqua,
body: SingleChildScrollView(
child: Padding(
padding: const EdgeInsets.only(top: 32.0),
child: Form(
key: _formKey,
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
TextFormField(
validator: Validators().validateEmail,
controller: emailController,
onChanged: (val) {
setState(() => email = val);
},
decoration: InputDecoration(
prefixIcon: Icon(Icons.email),
hintText: "Email",
hintStyle: TextStyle(color: Colors.grey),
border: InputBorder.none),
),
ElevatedButton(
onPressed: () {
if (_formKey.currentState.validate()) {}
},
child: Text('Submit'),
),
]),
))));
}
}
class Validators {
String validateEmail(String value) {
print("value $value");
String pattern = r'(^[a-z,A-Z ]*$)';
RegExp regExp = new RegExp(pattern);
if (!regExp.hasMatch(value)) {
return "Name must be a-z and A-Z";
}
return null;
}
}
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
visualDensity: VisualDensity.adaptivePlatformDensity,
),
home: RegistrationPage(),
);
}
}