Form

用于将多个表单字段组件组合在一起的容器组件

每个单独的表单字段都应当用FormField组件包裹,并将这些FormFieldForm组件包裹。调用FormState上的方法来保存、重置或校验该Form上的所有FormField。要获取FormState可以使用Form.of并传入一个组件树中有Form组件的context,或者向Form构造函数传递GlobalKey,然后通过GlobalKey.currentState调用。

示例

import 'package:flutter/material.dart';

/// Flutter code sample for [Form].

void main() => runApp(const FormExampleApp());

class FormExampleApp extends StatelessWidget {
  const FormExampleApp({super.key});

  
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(title: const Text('Form Sample')),
        body: const FormExample(),
      ),
    );
  }
}

class FormExample extends StatefulWidget {
  const FormExample({super.key});

  
  State<FormExample> createState() => _FormExampleState();
}

class _FormExampleState extends State<FormExample> {
  final GlobalKey<FormState> _formKey = GlobalKey<FormState>();

  
  Widget build(BuildContext context) {
    return Form(
      key: _formKey,
      child: Column(
        crossAxisAlignment: CrossAxisAlignment.start,
        children: <Widget>[
          TextFormField(
            decoration: const InputDecoration(hintText: 'Enter your email'),
            validator: (String? value) {
              if (value == null || value.isEmpty) {
                return 'Please enter some text';
              }
              return null;
            },
          ),
          Padding(
            padding: const EdgeInsets.symmetric(vertical: 16.0),
            child: ElevatedButton(
              onPressed: () {
                // Validate will return true if the form is valid, or false if
                // the form is invalid.
                if (_formKey.currentState!.validate()) {
                  // Process data.
                }
              },
              child: const Text('Submit'),
            ),
          ),
        ],
      ),
    );
  }
}

这个示例展示了一个Form中包含一个用于输入邮箱的TextFormField和一个用于提交表单的ElevatedButton。一个GlobalKey用于标识Form并且通过这个GlobalKey去校验输入内容。

构造函数

Form.new({
  Key? key, 
  required Widget child, 
  bool? canPop, 
  ('Use onPopInvokedWithResult instead. ' 'This feature was deprecated after v3.22.0-12.0.pre.') PopInvokedCallback? onPopInvoked, 
  PopInvokedWithResultCallback<Object?>? onPopInvokedWithResult, 
  ('Use canPop and/or onPopInvokedWithResult instead. ' 'This feature was deprecated after v3.12.0-1.0.pre.') WillPopCallback? onWillPop, 
  VoidCallback? onChanged, 
  AutovalidateMode? autovalidateMode
})

属性

属性名属性类型说明
autovalidateModeAutovalidateMode用于设置Form的表单字段是否自动校验并更新错误信息
canPopbool?如果设置为false,阻止当前路由出栈
childWidget子组件
onChangedVoidCallback?当表单中有字段发生变动时,会调用该回调
onPopInvokedWithResultPopInvokedWithResultCallback<Object?>?当用户尝试通过系统返回键离开当前页面时,允许拦截并处理返回行为,同时可以携带一个返回值给上一个路由

静态方法

方法名方法类型说明
maybeOf(BuildContext context) -> FormState?返回传入的context中包含的最接近的Form组件的FormState,如果没找到则返回null
of(BuildContext context) -> FormState返回传入的context中包含的最接近的Form组件的FormState