Flutter输入表单插件input_sheet的使用

Flutter输入表单插件input_sheet的使用

flutter-input-sheet 是一个用于在 Flutter 中实现输入表单的插件。它通过将输入框嵌入到底部弹出的表单中,使得表单设计更加简洁和直观。该插件支持多种输入类型,如文本、长文本、日期、时间、选项选择等,并且提供了丰富的组件来展示表单数据。


安装

pubspec.yaml 文件中添加以下依赖:

dependencies:
  input_sheet: <最新版本>

还需要添加其他依赖项以支持某些输入类型(如照片和视频):

dependencies:
  camera: ^0.5.8+1
  video_compress: ^2.0.0
  flutter_cupertino_date_picker: ^1.0.12

iOS 权限配置

Info.plist 文件中添加相机和麦克风权限:

<key>NSCameraUsageDescription</key>
<string>Can I use the camera please?</string>
<key>NSMicrophoneUsageDescription</key>
<string>Can I use the mic please?</string>

Android 权限配置

AndroidManifest.xml 文件中添加相机和存储权限:

<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="18" />

特性

  • 文本输入
  • 长文本输入
  • 掩码输入(如电话号码)
  • 数字输入
  • 日期选择
  • 时间选择
  • 日期时间选择
  • 单选选项
  • 多选选项
  • 照片上传
  • 视频录制

基本组件

flutter-input-sheet 提供了一些基本组件来展示表单数据,例如:

  • IpsCard:卡片式布局展示表单字段。
  • IpsLabel:标签组件。
  • IpsError:错误提示组件。
  • IpsIcon:图标组件。
  • IpsValue:值展示组件。
  • IpsPhoto:照片预览组件。
  • IpsVideo:视频预览组件。

示例代码

以下是一个完整的简单示例,展示了如何使用 flutter-input-sheet 插件创建一个包含多种输入类型的表单。

完整代码

import 'dart:io';
import 'dart:typed_data';

import 'package:flutter/material.dart';
import 'package:input_sheet/input_sheet.dart';
import 'package:input_sheet/components/IpsCard.dart';
import 'package:input_sheet/components/IpsError.dart';
import 'package:input_sheet/components/IpsIcon.dart';
import 'package:input_sheet/components/IpsLabel.dart';
import 'package:input_sheet/components/IpsPhoto.dart';
import 'package:input_sheet/components/IpsValue.dart';

void main() => runApp(MyApp());

class MyApp extends StatelessWidget {
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Input Sheet Demo',
      home: MyHomePage(title: 'Input Sheet Demo'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  MyHomePage({Key key, this.title}) : super(key: key);

  final String title;

  [@override](/user/override)
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  String _name;
  File _photo;
  Uint8List _thumbnailVideo;

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: SingleChildScrollView(
        child: Padding(
          padding: EdgeInsets.all(25),
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: [
              // 名称输入
              IpsCard(
                label: IpsLabel("Name"),
                value: IpsValue(_name ?? "Touch to edit..."),
                icon: IpsIcon(Icons.person),
                onClick: () => InputSheet(
                  context,
                  label: "Name",
                  cancelText: "Cancel",
                  doneText: "Confirm",
                ).text(
                  placeholder: "Type here...",
                  value: _name,
                  onDone: (dynamic value) => setState(() {
                    _name = value;
                  }),
                ),
              ),
              SizedBox(height: 25),

              // 照片上传
              IpsCard(
                label: IpsLabel("Upload Photo"),
                value: IpsPhoto(
                  file: _photo,
                  onClick: () => InputSheet(
                    context,
                    cancelText: "Cancel",
                    doneText: "Confirm",
                  ).photo(
                    file: _photo,
                    onDone: (File file, Uint8List thumbnail) =>
                        setState(() {
                      _photo = file;
                    }),
                  ),
                ),
              ),
              SizedBox(height: 25),

              // 视频录制
              IpsCard(
                label: IpsLabel("Record Video"),
                value: IpsVideo(
                  thumbnail: _thumbnailVideo,
                  onClick: () => InputSheet(
                    context,
                    cancelText: "Cancel",
                    doneText: "Confirm",
                  ).video(
                    file: _video,
                    onDone: (File file, Uint8List thumbnail) =>
                        setState(() {
                      _video = file;
                      _thumbnailVideo = thumbnail;
                    }),
                  ),
                ),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

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

1 回复

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


input_sheet 是一个 Flutter 插件,用于在底部弹出一个输入表单,用户可以在其中输入信息。这个插件非常适合在需要用户输入少量信息的场景中使用,例如输入一个简短的文本或选择一个选项。

安装

首先,你需要在 pubspec.yaml 文件中添加 input_sheet 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  input_sheet: ^1.0.0  # 请使用最新的版本号

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

基本用法

input_sheet 的基本用法非常简单。你可以使用 InputSheet.show() 方法来显示一个输入表单。

以下是一个简单的示例:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('InputSheet Example'),
        ),
        body: Center(
          child: ElevatedButton(
            onPressed: () {
              _showInputSheet(context);
            },
            child: Text('Show Input Sheet'),
          ),
        ),
      ),
    );
  }

  void _showInputSheet(BuildContext context) {
    InputSheet.show(
      context: context,
      title: '请输入您的姓名',
      placeholder: '姓名',
      onSubmitted: (value) {
        print('用户输入的姓名: $value');
      },
    );
  }
}

参数说明

InputSheet.show() 方法接受多个参数,以下是一些常用的参数:

  • context: 上下文,通常是 BuildContext
  • title: 输入表单的标题。
  • placeholder: 输入框的占位符文本。
  • onSubmitted: 当用户提交输入时调用的回调函数,参数是用户输入的值。
  • validator: 用于验证用户输入的函数,返回一个错误消息或 null
  • keyboardType: 输入框的键盘类型,例如 TextInputType.textTextInputType.number 等。
  • maxLines: 输入框的最大行数。
  • initialValue: 输入框的初始值。

自定义样式

你可以通过 InputSheetstyle 参数来自定义输入表单的样式。例如:

InputSheet.show(
  context: context,
  title: '请输入您的姓名',
  placeholder: '姓名',
  style: InputSheetStyle(
    titleStyle: TextStyle(fontSize: 20, fontWeight: FontWeight.bold),
    inputTextStyle: TextStyle(color: Colors.blue),
    backgroundColor: Colors.white,
    borderRadius: BorderRadius.circular(10),
  ),
  onSubmitted: (value) {
    print('用户输入的姓名: $value');
  },
);

处理验证

你可以使用 validator 参数来验证用户输入。例如:

InputSheet.show(
  context: context,
  title: '请输入您的姓名',
  placeholder: '姓名',
  validator: (value) {
    if (value.isEmpty) {
      return '姓名不能为空';
    }
    return null;
  },
  onSubmitted: (value) {
    print('用户输入的姓名: $value');
  },
);
回到顶部