0

我有几个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,但如果我只是在单独的类中编写相同的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;
  }
}
4

2 回答 2

0

如果您想在整个项目中使用您的验证器功能。只需将它粘贴到类之外并在任何地方使用它或者您也可以创建新文件并将函数粘贴到那里并在其他文件上使用它们在这种方法上不要忘记导入文件。(在函数名上使用 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;
  }

或者如果你想在一个类中使用这些函数。然后首先创建一个实例并调用该函数。

于 2020-11-26T05:22:46.787 回答
0

您可以在下面复制粘贴运行完整代码
您可以使用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(),
    );
  }
}
于 2020-11-26T05:29:18.137 回答