Flutter表单管理插件flutter_formik的使用

Flutter 表单管理插件 flutter_formik 的使用

Flutter Formik 是一个受 React Formik 启发的 Flutter 表单管理库。它提供了一种简单直观的方式来处理表单状态、验证和提交操作。Flutter Formik 设计简单、灵活且可扩展,允许你在 Flutter 应用程序中构建复杂的表单而无需编写大量样板代码。它基于 form_validator 包来提供可自定义的验证规则和错误消息。

特性

  • 简单声明式的 API 来管理表单状态
  • 使用 form_validator 包支持内置验证功能,并可自定义验证规则
  • 支持表单提交,可选异步操作
  • 与 Flutter 的小部件树无缝集成
  • 促进关注点分离和可重用性

安装

要在你的 Flutter 项目中使用 Flutter Formik,请在 pubspec.yaml 文件中添加以下依赖:

dependencies:
  flutter_formik: ^1.0.0

然后运行 flutter pub get 来安装包。

使用

以下是一个基本的使用示例:

import 'package:flutter/material.dart';
import 'package:flutter_formik/flutter_formik.dart';
import 'package:form_validator/form_validator.dart';

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

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Formik Demo',
      theme: ThemeData(
        colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
        useMaterial3: true,
      ),
      home: Scaffold(
        appBar: AppBar(
          backgroundColor: Theme.of(context).colorScheme.inversePrimary,
          title: const Text('Flutter Formik Demo'),
        ),
        body: Formik(
          initialValues: {
            'email': '',
            'password': '',
          },
          validationSchema: {
            'email': ValidationBuilder()
                .required('Email is required')
                .email('Email is not valid'),
            'password': ValidationBuilder()
                .required('Password is required')
                .minLength(6, 'Password must be at least 6 characters'),
          },
          onSubmit: (payload, errors) {
            if (errors.isNotEmpty) {
              ScaffoldMessenger.of(context).showSnackBar(
                SnackBar(
                  content: Text(errors.values.first),
                ),
              );
              return;
            }
            UserModel user = UserModel.fromJson(payload);
            // 发送用户对象到业务逻辑
            // ...
          },
          child: (values, isValid, handleSubmit, handleReset, handleChange, errors) {
            return Column(
              children: [
                TextField(
                  decoration: InputDecoration(
                    labelText: 'Email',
                    errorText: errors['email'],
                  ),
                  onChanged: (value) {
                    handleChange('email', value);
                  },
                ),
                TextField(
                  decoration: InputDecoration(
                    labelText: 'Password',
                    errorText: errors['password'],
                  ),
                  onChanged: (value) {
                    handleChange('password', value);
                  },
                ),
                ElevatedButton(
                  onPressed: () {
                    handleSubmit();
                  },
                  child: const Text('Submit'),
                ),
              ],
            );
          },
        ),
      ),
    );
  }
}

代码解释

  1. 导入必要的包:

    import 'package:flutter/material.dart';
    import 'package:flutter_formik/flutter_formik.dart';
    import 'package:form_validator/form_validator.dart';
    
  2. 初始化应用:

    void main() {
      runApp(const Demo());
    }
    
  3. 创建应用主界面:

    class Demo extends StatelessWidget {
      const Demo({super.key});
    
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          title: 'Flutter Formik Demo',
          theme: ThemeData(
            colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
            useMaterial3: true,
          ),
          home: Scaffold(
            appBar: AppBar(
              backgroundColor: Theme.of(context).colorScheme.inversePrimary,
              title: const Text('Flutter Formik Demo'),
            ),
            body: Formik(
              // 初始化表单字段值
              initialValues: {
                'email': '',
                'password': '',
              },
              // 设置验证规则
              validationSchema: {
                'email': ValidationBuilder()
                    .required('Email is required')
                    .email('Email is not valid'),
                'password': ValidationBuilder()
                    .required('Password is required')
                    .minLength(6, 'Password must be at least 6 characters'),
              },
              // 处理表单提交
              onSubmit: (payload, errors) {
                if (errors.isNotEmpty) {
                  ScaffoldMessenger.of(context).showSnackBar(
                    SnackBar(
                      content: Text(errors.values.first),
                    ),
                  );
                  return;
                }
                UserModel user = UserModel.fromJson(payload);
                // 发送用户对象到业务逻辑
                // ...
              },
              // 构建表单组件
              child: (values, isValid, handleSubmit, handleReset, handleChange, errors) {
                return Column(
                  children: [
                    TextField(
                      decoration: InputDecoration(
                        labelText: 'Email',
                        errorText: errors['email'],
                      ),
                      onChanged: (value) {
                        handleChange('email', value);
                      },
                    ),
                    TextField(
                      decoration: InputDecoration(
                        labelText: 'Password',
                        errorText: errors['password'],
                      ),
                      onChanged: (value) {
                        handleChange('password', value);
                      },
                    ),
                    ElevatedButton(
                      onPressed: () {
                        handleSubmit();
                      },
                      child: const Text('Submit'),
                    ),
                  ],
                );
              },
            ),
          ),
        );
      }
    }
    

更多关于Flutter表单管理插件flutter_formik的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter表单管理插件flutter_formik的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,flutter_formik 是一个用于 Flutter 的表单管理库,它提供了一种简洁的方式来处理表单状态、验证和提交。以下是一个简单的示例,展示如何使用 flutter_formik 来管理一个包含用户名和密码的登录表单。

首先,确保在你的 pubspec.yaml 文件中添加 flutter_formik 依赖:

dependencies:
  flutter:
    sdk: flutter
  flutter_formik: ^x.y.z  # 请替换为最新版本号

然后运行 flutter pub get 来安装依赖。

接下来,创建一个简单的 Flutter 应用,并使用 flutter_formik 来管理表单。以下是一个完整的示例代码:

import 'package:flutter/material.dart';
import 'package:flutter_formik/flutter_formik.dart';

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Formik Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyFormScreen(),
    );
  }
}

class MyFormScreen extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Formik Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: FormikProvider(
          initValues: {
            'username': '',
            'password': '',
          },
          validationRules: {
            'username': (value) =>
                value!.isEmpty ? 'Username is required' : null,
            'password': (value) =>
                value!.isEmpty ? 'Password is required' : null,
          },
          child: FormikBuilder(
            builder: (context, formik, setField) {
              return Column(
                children: [
                  TextFormField(
                    decoration: InputDecoration(labelText: 'Username'),
                    onChanged: (value) => setField('username', value),
                    validator: (value) => formik.errors['username'],
                  ),
                  TextFormField(
                    decoration: InputDecoration(labelText: 'Password'),
                    obscureText: true,
                    onChanged: (value) => setField('password', value),
                    validator: (value) => formik.errors['password'],
                  ),
                  SizedBox(height: 20),
                  ElevatedButton(
                    onPressed: () async {
                      final isValid = await formik.validate();
                      if (isValid) {
                        // 提交表单数据
                        print('Username: ${formik.values['username']}');
                        print('Password: ${formik.values['password']}');
                        // TODO: 在这里处理表单提交逻辑
                      }
                    },
                    child: Text('Submit'),
                  ),
                ],
              );
            },
          ),
        ),
      ),
    );
  }
}

在这个示例中:

  1. FormikProvider 用于初始化表单的值和验证规则。
  2. initValues 包含了表单的初始值。
  3. validationRules 定义了每个字段的验证逻辑。
  4. FormikBuilder 是一个构建器,它提供了对 FormikState 的访问,允许我们获取表单的值和错误,并设置字段值。
  5. 每个 TextFormField 的 onChanged 回调使用 setField 方法来更新表单状态。
  6. validator 属性使用 formik.errors 来显示验证错误。
  7. ElevatedButton 的 onPressed 回调首先调用 formik.validate() 来验证表单,如果验证通过,则处理表单提交逻辑。

这个示例展示了如何使用 flutter_formik 来管理表单状态、验证和提交,希望对你有帮助!

回到顶部