Flutter文本表单封装插件text_form_field_wrapper的使用

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

Flutter文本表单封装插件text_form_field_wrapper的使用

text_form_field_wrapper 是一个用于装饰 TextFormField 的 Flutter 插件,它提供了带有边框和圆角的功能,并且可以轻松调整这些属性,适用于需要放置在一起的 TextFormFields

安装

在你的 Flutter 项目的 pubspec.yaml 文件中添加以下依赖:

dependencies:
  text_form_field_wrapper: ^1.0.0

然后导入到你使用的每个文件中:

import 'package:text_form_field_wrapper/text_form_field_wrapper.dart';

使用

示例 1:基本用法

这是一个非常基础的、独立的 TextFormFieldWrapper 示例:

TextEditingController myController = TextEditingController();

TextFormFieldWrapper(
    formField: TextFormField(
      controller: myController,
      decoration: const InputDecoration(
          border: InputBorder.none),
    ),
    position: TextFormFieldPosition.alone,
),

示例 2:复杂布局

这个示例展示了如何在一个列中放置一个文本字段,在该列下方有两个并排的文本字段:

TextEditingController myController1 = TextEditingController();
TextEditingController myController2 = TextEditingController();
TextEditingController myController3 = TextEditingController();

Column(children: [
    TextFormFieldWrapper(
        formField: TextFormField(
            controller: myController1,
            decoration: const InputDecoration(
                border: InputBorder.none),
        ),
        position: TextFormFieldPosition.top,
    ),
    Row(children: [
        Expanded(child: TextFormFieldWrapper(
            formField: TextFormField(
                controller: myController2,
                decoration: const InputDecoration(
                    border: InputBorder.none),
            ),
            position: TextFormFieldPosition.bottomLeft,
        )),
        Expanded(child: TextFormFieldWrapper(
            formField: TextFormField(
                controller: myController3,
                decoration: const InputDecoration(
                    border: InputBorder.none),
            ),
            position: TextFormFieldPosition.bottomRight,
        )),
    ]),
]),

完整示例 Demo

下面是一个完整的示例代码,展示了如何在实际应用中使用 text_form_field_wrapper 插件:

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

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

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

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(primarySwatch: Colors.blue),
      home: const MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({Key? key}) : super(key: key);

  @override
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  @override
  Widget build(BuildContext context) {
    TextFormField formField = TextFormField(
      initialValue: '',
      decoration: const InputDecoration(border: InputBorder.none),
    );

    return Scaffold(
      appBar: AppBar(
        title: const Text('Text Form Field Wrapper'),
      ),
      body: SafeArea(
        child: Center(
          child: SingleChildScrollView(
            child: Container(
              constraints: const BoxConstraints(maxWidth: 600),
              padding: const EdgeInsets.symmetric(horizontal: 16),
              child: Column(
                crossAxisAlignment: CrossAxisAlignment.start,
                children: [
                  const SizedBox(height: 20),
                  // Standalone field with no suffix or prefix
                  const Padding(
                    padding: EdgeInsets.symmetric(horizontal: 12.0, vertical: 4.0),
                    child: Text('Standalone field with no suffix or prefix'),
                  ),
                  TextFormFieldWrapper(
                    formField: formField,
                    position: TextFormFieldPosition.alone,
                  ),
                  const SizedBox(height: 20),
                  // Standalone field with prefix only
                  const Padding(
                    padding: EdgeInsets.symmetric(horizontal: 12.0, vertical: 4.0),
                    child: Text('Standalone field with prefix only'),
                  ),
                  TextFormFieldWrapper(
                    formField: formField,
                    position: TextFormFieldPosition.alone,
                    prefix: const Text('Prefix'),
                  ),
                  const SizedBox(height: 20),
                  // Standalone field with suffix only
                  const Padding(
                    padding: EdgeInsets.symmetric(horizontal: 12.0, vertical: 4.0),
                    child: Text('Standalone field with suffix only'),
                  ),
                  TextFormFieldWrapper(
                    formField: formField,
                    position: TextFormFieldPosition.alone,
                    suffix: const Text('Suffix'),
                  ),
                  const SizedBox(height: 20),
                  // Standalone field with prefix and suffix
                  const Padding(
                    padding: EdgeInsets.symmetric(horizontal: 12.0, vertical: 4.0),
                    child: Text('Standalone field with prefix and suffix'),
                  ),
                  TextFormFieldWrapper(
                    formField: formField,
                    position: TextFormFieldPosition.alone,
                    prefix: const Text('Prefix'),
                    suffix: const Text('Suffix'),
                  ),
                  const SizedBox(height: 20),
                  // Two fields side by side
                  const Padding(
                    padding: EdgeInsets.symmetric(horizontal: 12.0, vertical: 4.0),
                    child: Text('Two fields side by side'),
                  ),
                  Row(
                    children: [
                      Expanded(
                        child: TextFormFieldWrapper(
                          formField: formField,
                          position: TextFormFieldPosition.left,
                        ),
                      ),
                      Expanded(
                        child: TextFormFieldWrapper(
                          formField: formField,
                          position: TextFormFieldPosition.right,
                        ),
                      ),
                    ],
                  ),
                  const SizedBox(height: 20),
                  // Multiple fields stacked on top of another
                  const Padding(
                    padding: EdgeInsets.symmetric(horizontal: 12.0, vertical: 4.0),
                    child: Text('Multiple fields stacked on top of another'),
                  ),
                  Column(
                    children: [
                      TextFormFieldWrapper(
                        formField: formField,
                        position: TextFormFieldPosition.top,
                      ),
                      TextFormFieldWrapper(
                        formField: formField,
                        position: TextFormFieldPosition.center,
                      ),
                      TextFormFieldWrapper(
                        formField: formField,
                        position: TextFormFieldPosition.bottom,
                      ),
                    ],
                  ),
                  const SizedBox(height: 20),
                  // Collection of textfields to mimic credit card input
                  const Padding(
                    padding: EdgeInsets.symmetric(horizontal: 12.0, vertical: 4.0),
                    child: Text('Collection of textfields to mimic credit card input'),
                  ),
                  Column(
                    children: [
                      TextFormFieldWrapper(
                        formField: TextFormField(
                          initialValue: '',
                          textAlign: TextAlign.center,
                          decoration: const InputDecoration(
                              hintText: '1234 1234 1234 1234',
                              hintStyle: TextStyle(letterSpacing: 6, fontSize: 18),
                              border: InputBorder.none),
                        ),
                        position: TextFormFieldPosition.top,
                        suffix: const Icon(Icons.credit_card),
                      ),
                      Row(
                        children: [
                          Expanded(
                            child: TextFormFieldWrapper(
                              formField: TextFormField(
                                initialValue: '',
                                textAlign: TextAlign.center,
                                decoration: const InputDecoration(
                                    hintText: 'MM/YY',
                                    hintStyle: TextStyle(letterSpacing: 6, fontSize: 18),
                                    border: InputBorder.none),
                              ),
                              position: TextFormFieldPosition.bottomLeft,
                            ),
                          ),
                          Expanded(
                            child: TextFormFieldWrapper(
                              formField: TextFormField(
                                initialValue: '',
                                textAlign: TextAlign.center,
                                decoration: const InputDecoration(
                                    hintText: 'CVV',
                                    hintStyle: TextStyle(letterSpacing: 6, fontSize: 18),
                                    border: InputBorder.none),
                              ),
                              position: TextFormFieldPosition.bottomRight,
                            ),
                          ),
                        ],
                      ),
                      const SizedBox(height: 80),
                    ],
                  ),
                ],
              ),
            ),
          ),
        ),
      ),
    );
  }
}

这个示例展示了如何在不同的布局中使用 TextFormFieldWrapper,包括单独的字段、带有前缀或后缀的字段、并排的字段以及堆叠的字段。你可以根据自己的需求进行修改和扩展。


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

1 回复

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


当然,下面是一个关于如何使用 text_form_field_wrapper 插件的 Flutter 代码示例。这个插件可以帮助你更轻松地封装和重用文本表单字段。假设你已经将这个插件添加到了你的 pubspec.yaml 文件中:

dependencies:
  flutter:
    sdk: flutter
  text_form_field_wrapper: ^最新版本号

然后,你可以在你的 Flutter 应用中这样使用它:

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

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

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

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  final _formKey = GlobalKey<FormState>();
  String _username = '';
  String _email = '';

  void _submit() {
    if (_formKey.currentState!.validate()) {
      _formKey.currentState!.save();
      print('Username: $_username');
      print('Email: $_email');
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Text Form Field Wrapper Demo'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Form(
          key: _formKey,
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: <Widget>[
              TextFormFieldWrapper(
                labelText: 'Username',
                validator: (value) {
                  if (value == null || value.isEmpty) {
                    return 'Username is required';
                  }
                  return null;
                },
                onSaved: (value) {
                  _username = value!;
                },
              ),
              SizedBox(height: 16),
              TextFormFieldWrapper(
                labelText: 'Email',
                validator: (value) {
                  if (value == null || value.isEmpty) {
                    return 'Email is required';
                  }
                  if (!value!.contains('@')) {
                    return 'Invalid email address';
                  }
                  return null;
                },
                onSaved: (value) {
                  _email = value!;
                },
                keyboardType: TextInputType.emailAddress,
              ),
              SizedBox(height: 24),
              ElevatedButton(
                onPressed: _submit,
                child: Text('Submit'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

在这个示例中,我们做了以下几件事:

  1. 引入必要的包:引入了 fluttertext_form_field_wrapper 包。
  2. 定义表单状态:使用 GlobalKey<FormState> 来管理表单状态,并定义了两个字符串变量 _username_email 来保存表单数据。
  3. 创建表单:使用 Form 组件,并在其中使用 TextFormFieldWrapper 封装了两个文本字段,一个用于用户名,一个用于电子邮件。
  4. 验证和保存数据:为每个文本字段提供了验证器和保存回调。验证器用于检查输入是否有效,保存回调用于在验证通过后保存输入数据。
  5. 提交按钮:在表单下方添加了一个 ElevatedButton,点击按钮时调用 _submit 方法来验证和提交表单。

请注意,你需要确保 text_form_field_wrapper 插件已经正确安装,并且你使用的是最新版本。如果插件的 API 有所变化,请查阅最新的文档以获取更新信息。

回到顶部