Как записать валидаторы в отдельный файл Dart?

#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(),
    );
  }
}