Flutter表单字段插件flutter_form_fields的使用

发布于 1周前 作者 h691938207 来自 Flutter

Flutter表单字段插件flutter_form_fields的使用

此README描述了该软件包。如果您将此软件包发布到pub.dev,则此README的内容将出现在您的软件包首页。

有关编写良好软件包README的指南,请参阅撰写软件包页面

有关开发软件包的一般信息,请参阅Dart指南创建软件包和Flutter指南开发软件包和插件

功能

该软件包包含一些可以在表单中使用的自定义小部件。它们具有验证功能,可以帮助开发者在输入不符合条件时显示错误文本。默认情况下,Flutter SDK在某些输入字段上不提供验证功能。

开始使用

pubspec.yaml文件的依赖项下添加flutter_form_fields

示例

示例动图

使用方法

final ProfileImageFormFieldController profileImageController = ProfileImageFormFieldController();
final RadioFormFieldController ratingController<int> = RadioFormFieldController();
final CheckBoxFormFieldController mostLikedWidgetsController<Type> = CheckBoxFormFieldController();

ProfileImageFormField(
  controller: profileImageController,
  validator: (imageFile) {
    /// 验证条件
  }
),

RadioFormField<int>(
  titleText: "您会如何评价我们为这个包打分?",
  controller: ratingController,
  validator: (val) {
    if (ratingController.value == null) {
      return "请给我们评分";
    }
    return null;
  },
  items: [
    RadioFormFieldItem(hintText: '5 星', value: 5),
    RadioFormFieldItem(hintText: '4 星', value: 4),
    RadioFormFieldItem(hintText: '3 星', value: 3),
    RadioFormFieldItem(hintText: '2 星', value: 3),
    RadioFormFieldItem(hintText: '1 星', value: 1),
  ]
),

CheckBoxFormField<Type>(
  titleText: "请选择您最喜欢的两个小部件?",
  items: [
    CheckBoxFormFieldItem(
      hintText: 'ProfileImageFormField 小部件',
      value: ProfileImageFormField
    ),
    CheckBoxFormFieldItem(
      hintText: 'RadioFormField 小部件',
      value: RadioFormField
    ),
    CheckBoxFormFieldItem(
      hintText: 'CheckBoxFormField 小部件',
      value: CheckBoxFormField
    ),
  ],
  controller: mostLikedWidgetsController,
  validator: (values) {
    return values?.isNotEmpty ?? false
        ? null
        : "请选择一个小部件";
  },
),

完整示例代码

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

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

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

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      theme: ThemeData.light().copyWith(useMaterial3: true),
      home: Scaffold(
        appBar: AppBar(
          title: const Text("反馈表单"),
        ),
        body: const FormWidget(),
      ),
    );
  }
}

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

  [@override](/user/override)
  State<FormWidget> createState() => _FormWidgetState();
}

class _FormWidgetState extends State<FormWidget> {
  late final GlobalKey<FormState> formKey;
  late final RadioFormFieldController<bool> understoodController;
  late final RadioFormFieldController<int> ratingController;
  late final RadioFormFieldController<bool> willRecommendController;
  late final ProfileImageFormFieldController profileImageController;
  late final CheckBoxFormFieldController<Type> mostLikedWidgetsController;

  [@override](/user/override)
  void initState() {
    formKey = GlobalKey<FormState>();
    understoodController = RadioFormFieldController();
    ratingController = RadioFormFieldController();
    willRecommendController = RadioFormFieldController();
    profileImageController = ProfileImageFormFieldController();
    mostLikedWidgetsController = CheckBoxFormFieldController();
    super.initState();
  }

  [@override](/user/override)
  void dispose() {
    formKey.currentState?.dispose();
    understoodController.dispose();
    ratingController.dispose();
    willRecommendController.dispose();
    profileImageController.dispose();
    super.dispose();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Form(
      key: formKey,
      child: ListView(
        padding: const EdgeInsets.all(20),
        children: [
          /// 如果errorText和validator都为空,则会显示默认的错误文本。
          ProfileImageFormField(
            controller: profileImageController,
          ),

          /// 如果validator不为空,该小部件将显示由validator返回的字符串,而不是errorText或默认的错误文本。
          RadioFormField<bool>(
            titleText: "我希望您通过这个示例应用程序理解如何使用此包。您能确认吗?",
            controller: understoodController,
            items: [
              RadioFormFieldItem(hintText: '是', value: true),
              RadioFormFieldItem(hintText: '否', value: false)
            ],
            direction: Axis.vertical,
            validator: (val) {
              if (understoodController.value == null) {
                return "请选择至少一个选项";
              }
              return null;
            },
          ),
          RadioFormField<int>(
            titleText: "您会如何评价我们为这个包打分?",
            controller: ratingController,
            validator: (val) {
              if (ratingController.value == null) {
                return "请给我们评分";
              }
              return null;
            },
            items: [
              RadioFormFieldItem(hintText: '5 星', value: 5),
              RadioFormFieldItem(hintText: '4 星', value: 4),
              RadioFormFieldItem(hintText: '3 星', value: 3),
              RadioFormFieldItem(hintText: '2 星', value: 3),
              RadioFormFieldItem(hintText: '1 星', value: 1),
            ]
          ),

          /// 如果validator为空且errorText不为空,则该小部件将显示errorText参数给出的错误文本。
          RadioFormField<bool>(
            titleText: "您会推荐这个包给您的开发朋友吗?",
            controller: willRecommendController,
            errorText: "我们想知道。请!",
            items: [
              RadioFormFieldItem(hintText: '是', value: true),
              RadioFormFieldItem(hintText: '否', value: false)
            ]
          ),
          CheckBoxFormField<Type>(
            titleText: "请选择您最喜欢的两个小部件?",
            items: [
              CheckBoxFormFieldItem(
                hintText: 'ProfileImageFormField 小部件',
                value: ProfileImageFormField
              ),
              CheckBoxFormFieldItem(
                hintText: 'RadioFormField 小部件',
                value: RadioFormField
              ),
              CheckBoxFormFieldItem(
                hintText: 'CheckBoxFormField 小部件',
                value: CheckBoxFormField
              ),
            ],
            controller: mostLikedWidgetsController,
            validator: (values) {
              return values?.isNotEmpty ?? false
                  ? null
                  : "请选择一个小部件";
            },
          ),

          ElevatedButton(
            onPressed: () {
              if (formKey.currentState!.validate()) {
                ScaffoldMessenger.of(context).showSnackBar(
                  const SnackBar(
                    content: Text("反馈表单提交成功"),
                    backgroundColor: Colors.green,
                  ),
                );
              } else {
                ScaffoldMessenger.of(context).showSnackBar(
                  const SnackBar(
                    content: Text("表单无效"),
                    backgroundColor: Colors.red,
                  ),
                );
              }
            },
            child: const Text("提交"),
          )
        ],
      ),
    );
  }
}

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

1 回复

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


当然,下面是一个关于如何在Flutter中使用flutter_form_fields插件来创建表单字段的代码示例。这个插件提供了一系列预构建的表单字段,可以方便地用于数据输入。

首先,确保你已经在pubspec.yaml文件中添加了flutter_form_fields依赖:

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

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

接下来是一个完整的Flutter应用示例,展示如何使用flutter_form_fields插件来创建一些常见的表单字段,比如文本字段、密码字段、日期选择字段等。

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

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

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

class MyFormPage extends StatefulWidget {
  @override
  _MyFormPageState createState() => _MyFormPageState();
}

class _MyFormPageState extends State<MyFormPage> {
  final _formKey = GlobalKey<FormState>();

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Form Fields Example'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Form(
          key: _formKey,
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: <Widget>[
              TextFormField(
                decoration: InputDecoration(labelText: 'Name'),
                validator: (value) {
                  if (value == null || value.isEmpty) {
                    return 'Name is required';
                  }
                  return null;
                },
              ),
              SizedBox(height: 16),

              // 使用flutter_form_fields的TextFormField
              FFTextField(
                name: 'email',
                decoration: InputDecoration(labelText: 'Email'),
                validator: (value) {
                  if (!value!.contains('@')) {
                    return 'Email is not valid';
                  }
                  return null;
                },
              ),
              SizedBox(height: 16),

              // 密码字段
              FFPasswordField(
                name: 'password',
                decoration: InputDecoration(labelText: 'Password'),
                validator: (value) {
                  if (value == null || value.isEmpty) {
                    return 'Password is required';
                  }
                  return null;
                },
              ),
              SizedBox(height: 16),

              // 日期选择字段
              FFDateTimeField(
                name: 'dob',
                decoration: InputDecoration(labelText: 'Date of Birth'),
                inputType: InputType.date,
                validator: (value) {
                  if (value == null) {
                    return 'Date of Birth is required';
                  }
                  return null;
                },
              ),
              SizedBox(height: 24),

              ElevatedButton(
                onPressed: () {
                  if (_formKey.currentState!.validate()) {
                    // 如果验证通过,可以在这里处理表单数据
                    print('Form submitted');
                  }
                },
                child: Text('Submit'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

在这个示例中,我们使用了flutter_form_fields插件中的FFTextFieldFFPasswordField来代替标准的TextFormField,同时使用了FFDateTimeField来创建一个日期选择字段。这些字段都支持验证功能,可以在用户提交表单时进行验证。

注意:

  • FFTextFieldFFPasswordField提供了与TextFormField类似的功能,但可能有额外的配置选项。
  • FFDateTimeField允许用户选择日期和时间,非常适合需要日期输入的表单。

确保你已经正确安装了flutter_form_fields插件,并根据需要调整字段的装饰和验证逻辑。

回到顶部