Flutter插件junny_forme的介绍与使用方法

在本文中,我们将探讨如何使用 junny_forme 插件来构建一个具有动态表单验证功能的 Flutter 应用。通过该插件,我们可以轻松实现表单字段的状态管理、验证逻辑以及与用户交互的实时反馈。


Web Demo

您可以访问以下链接查看 junny_forme 的在线演示:

https://www.qyh.me/forme3/index.html


简单使用

添加依赖

首先,在 pubspec.yaml 文件中添加以下依赖:

dependencies:
  forme: ^版本号
  forme_base_fields: ^版本号

然后运行以下命令以安装依赖:

flutter pub add forme
flutter pub add forme_base_fields

创建表单

接下来,我们创建一个简单的表单组件。以下是代码示例:

import 'package:flutter/material.dart';
import 'package:junny_forme/forme.dart';
import 'package:junny_forme/fields/forme_text_field.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: FormeExamplePage(),
    );
  }
}

class FormeExamplePage extends StatefulWidget {
  @override
  _FormeExamplePageState createState() => _FormeExamplePageState();
}

class _FormeExamplePageState extends State<FormeExamplePage> {
  final FormeKey _formKey = FormeKey();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Forme 示例'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Forme(
          key: _formKey,
          child: Column(
            children: [
              // 用户名输入框
              FormeTextField(
                name: 'username',
                decoration: const InputDecoration(labelText: '用户名'),
                validator: (value) {
                  if (value == null || value.isEmpty) {
                    return '请输入用户名';
                  }
                  return null;
                },
              ),
              const SizedBox(height: 16),
              // 密码输入框
              FormeTextField(
                name: 'password',
                decoration: const InputDecoration(labelText: '密码'),
                obscureText: true,
                validator: (value) {
                  if (value == null || value.length < 6) {
                    return '密码长度至少为6位';
                  }
                  return null;
                },
              ),
              const SizedBox(height: 16),
              // 提交按钮
              FormeValidationListener(
                builder: (context, validation, child) {
                  return ElevatedButton(
                    onPressed: validation.isValid ? () {
                      if (_formKey.validate().isSuccess) {
                        print('表单提交成功');
                      }
                    } : null,
                    child: const Text('提交'),
                  );
                },
              ),
            ],
          ),
        ),
      ),
    );
  }
}

Forme 属性

Forme 是整个表单的核心组件,支持以下属性:

属性名称 是否必填 类型 描述
key 否 FormeKey 全局键,用于控制表单状态
child 是 Widget 表单内容组件
onFieldStatusChanged 否 FormeFieldStatusChanged 监听字段状态变化
initialValue 否 Map<String, dynamic> 初始化值,会覆盖字段本身的 initialValue
onWillPop 否 WillPopCallback 检查是否允许返回上一页
quietlyValidate 否 bool 是否静默验证(不显示错误提示)
autovalidateMode 否 AutovalidateMode 自动验证模式
autovalidateByOrder 否 bool 是否按顺序自动验证
onFieldsRegistered 否 function 监听已注册字段
onFieldsUnregistered 否 function 监听未注册字段
onInitialized 否 function 通常用于注册访问器

FormeField 属性

FormeField 是表单字段的基本单元,支持以下通用属性:

属性名称 是否必填 类型 描述
name 否 String 字段的唯一标识符
readOnly 否 bool 是否只读,默认为 false
builder 是 FormeFieldBuilder 构建字段内容的回调函数
enabled 否 bool 是否启用字段,默认为 true
quietlyValidate 是 bool 是否静默验证,默认为 false
initialValue 是 T 字段的默认值,会被 Forme 的 initialValue 覆盖
asyncValidatorDebounce 否 Duration 异步验证的防抖时间,默认为 500ms
autovalidateMode 否 AutovalidateMode 自动验证模式
onStatusChanged 否 FormeFieldStatusChanged 字段状态变化时的回调
onInitialized 否 FormeFieldInitialized 通常用于注册访问器
onSaved 否 FormeFieldSetter 表单保存时触发的回调
validator 否 FormeValidator 同步验证器
asyncValidator 否 FormeAsyncValidator 异步验证器
decorator 否 FormeFieldDecorator 字段装饰器
order 否 int 字段的排序顺序
requestFocusOnUserInteraction 否 bool 是否在用户交互时请求焦点
validationFilter 否 function 用于确定是否执行验证
focusNode 否 FocusNode FocusNode

验证

异步验证

asyncValidator 是异步验证器,它返回一个 Future<String>。以下是一个示例:

asyncValidator: (field, value, isValid) {
  return Future.delayed(const Duration(seconds: 2), () {
    if (value == null || value.isEmpty) {
      return '请输入有效值';
    }
    return null;
  });
},

防抖机制

可以通过设置 asyncValidatorDebounce 来启用防抖机制:

asyncValidatorDebounce: const Duration(milliseconds: 500),

方法

FormeKey 和 FormeState

是否包含指定字段

bool hasField = _formKey.hasField('username');

获取字段状态

FormFieldState field = _formKey.field<FormFieldState>('username');

获取表单值

Map<String, dynamic> data = _formKey.value;

设置表单值

_formKey.value = {'username': 'newUser'};

验证表单

Future<FormeValidateSnapshot> future = _formKey.validate({
  bool quietly = false,
  Set<String> names = const {},
  bool clearError = false,
  bool validateByOrder = false,
});

监听器

FormeFieldStatusListener

监听字段状态变化:

FormeFieldStatusListener(
  filter: (status) => status.isValueChanged,
  name: 'username',
  builder: (context, status, child) {
    return Text('当前值: ${status.value}');
  },
),

FormeValidationListener

监听表单整体验证状态:

FormeValidationListener(
  builder: (context, validation, child) {
    return ElevatedButton(
      onPressed: validation.isValid ? submit : null,
      child: const Text('提交'),
    );
  },
),

更多关于Flutter插件junny_forme的介绍与使用方法的实战教程也可以访问 https://www.itying.com/category-92-b0.html

回到顶部