使用Flutter实现响应式表单验证

后端思维 2020-06-11 ⋅ 31 阅读

在移动应用开发中,表单验证是一个非常重要且常见的需求。Flutter提供了一种简单而强大的方式来处理表单验证,让我们能够轻松地处理表单输入的合法性校验。本文将介绍如何使用Flutter实现响应式表单验证,并通过示例代码详细说明各个步骤。

准备工作

在开始之前,我们首先需要确保已经正确安装了Flutter。如果还没有安装,请根据官方文档进行安装。

创建表单

首先,我们需要创建一个Flutter应用,并在应用中创建一个表单。以下是一个简单的示例代码,用于创建一个包含两个文本输入框的表单:

import 'package:flutter/material.dart';

class MyForm extends StatefulWidget {
  @override
  _MyFormState createState() => _MyFormState();
}

class _MyFormState extends State<MyForm> {
  final _formKey = GlobalKey<FormState>();

  @override
  Widget build(BuildContext context) {
    return Form(
      key: _formKey,
      child: Column(
        children: <Widget>[
          TextFormField(
            validator: (value) {
              if (value.isEmpty) {
                return '请输入用户名';
              }
              return null;
            },
            decoration: InputDecoration(
              labelText: '用户名',
            ),
          ),
          TextFormField(
            validator: (value) {
              if (value.isEmpty) {
                return '请输入密码';
              }
              return null;
            },
            decoration: InputDecoration(
              labelText: '密码',
            ),
          ),
          RaisedButton(
            onPressed: () {
              if (_formKey.currentState.validate()) {
                // 验证通过
              }
            },
            child: Text('提交'),
          ),
        ],
      ),
    );
  }
}

在上述代码中,我们首先创建了一个Form组件,并将其包裹住要进行验证的各个输入字段。每个输入字段都包含一个validator属性,该属性定义了校验规则。验证规则返回的字符串将作为错误消息显示在屏幕上。

值得注意的是,我们在_MyFormState类中创建了一个_formKey变量,并将其赋值给Form组件的key属性。这个_formKey将会在稍后的步骤中用到。

实时表单验证

接下来,我们将对表单进行实时的、响应式的验证。我们将在用户输入时即时验证输入字段,并在输入字段下方显示错误消息。以下是示例代码:

class _MyFormState extends State<MyForm> {
  final _formKey = GlobalKey<FormState>();
  String _username;
  String _password;

  @override
  Widget build(BuildContext context) {
    return Form(
      key: _formKey,
      child: Column(
        children: <Widget>[
          TextFormField(
            onChanged: (value) {
              setState(() {
                _username = value;
              });
            },
            validator: (value) {
              if (value.isEmpty) {
                return '请输入用户名';
              }
              return null;
            },
            decoration: InputDecoration(
              labelText: '用户名',
              errorText: _username == null ? null : (_username.isEmpty ? '请输入用户名' : null),
            ),
          ),
          TextFormField(
            onChanged: (value) {
              setState(() {
                _password = value;
              });
            },
            validator: (value) {
              if (value.isEmpty) {
                return '请输入密码';
              }
              return null;
            },
            decoration: InputDecoration(
              labelText: '密码',
              errorText: _password == null ? null : (_password.isEmpty ? '请输入密码' : null),
            ),
          ),
          RaisedButton(
            onPressed: () {
              if (_formKey.currentState.validate()) {
                // 验证通过
              }
            },
            child: Text('提交'),
          ),
        ],
      ),
    );
  }
}

在上述代码中,我们通过设置onChanged回调来监听输入字段的变化,并使用setState方法来更新对应的变量。然后,我们通过判断这些变量的值是否为空来展示错误消息。

提示消息

除了在输入字段下方显示错误消息之外,我们还可以通过弹出消息框的方式来提示用户。以下是一个示例代码:

class _MyFormState extends State<MyForm> {
  final _formKey = GlobalKey<FormState>();
  String _username;
  String _password;

  void _showSuccessDialog() {
    showDialog(
      context: context,
      builder: (BuildContext context) {
        return AlertDialog(
          title: Text('成功'),
          content: Text('表单提交成功'),
          actions: <Widget>[
            FlatButton(
              child: Text('确定'),
              onPressed: () {
                Navigator.of(context).pop();
              },
            ),
          ],
        );
      },
    );
  }

  void _showErrorDialog(String message) {
    showDialog(
      context: context,
      builder: (BuildContext context) {
        return AlertDialog(
          title: Text('错误'),
          content: Text(message),
          actions: <Widget>[
            FlatButton(
              child: Text('确定'),
              onPressed: () {
                Navigator.of(context).pop();
              },
            ),
          ],
        );
      },
    );
  }

  @override
  Widget build(BuildContext context) {
    return Form(
      key: _formKey,
      child: Column(
        children: <Widget>[
          TextFormField(
            onChanged: (value) {
              setState(() {
                _username = value;
              });
            },
            validator: (value) {
              if (value.isEmpty) {
                return '请输入用户名';
              }
              return null;
            },
            decoration: InputDecoration(
              labelText: '用户名',
              errorText: _username == null ? null : (_username.isEmpty ? '请输入用户名' : null),
            ),
          ),
          TextFormField(
            onChanged: (value) {
              setState(() {
                _password = value;
              });
            },
            validator: (value) {
              if (value.isEmpty) {
                return '请输入密码';
              }
              return null;
            },
            decoration: InputDecoration(
              labelText: '密码',
              errorText: _password == null ? null : (_password.isEmpty ? '请输入密码' : null),
            ),
          ),
          RaisedButton(
            onPressed: () {
              if (_formKey.currentState.validate()) {
                _showSuccessDialog();
              } else {
                _showErrorDialog('表单填写有误,请检查后重试');
              }
            },
            child: Text('提交'),
          ),
        ],
      ),
    );
  }
}

在上述代码中,我们定义了两个方法:_showSuccessDialog_showErrorDialog。这些方法会在表单验证通过或失败时被调用,分别显示成功和失败的提示框。

总结

在本文中,我们介绍了如何使用Flutter实现响应式表单验证。通过创建一个表单,并对表单进行实时的、响应式的验证,我们能够轻松地处理表单输入的合法性校验,并及时向用户展示验证结果。希望本文能够帮助你在使用Flutter开发移动应用时更加高效地处理表单验证的需求。


全部评论: 0

    我有话说: