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. 每个 TextFormFieldonChanged 回调使用 setField 方法来更新表单状态。
  6. validator 属性使用 formik.errors 来显示验证错误。
  7. ElevatedButtononPressed 回调首先调用 formik.validate() 来验证表单,如果验证通过,则处理表单提交逻辑。

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

回到顶部