Flutter表单页面管理插件form_page_view的使用
Flutter表单页面管理插件form_page_view的使用
Form Page View
是一个Flutter包,它允许你创建一个具有分页视图和进度条的表单。此包使得创建交互式且可自定义的表单变得简单,并且可以实现页面之间的无缝导航。
示例
圆形指示器
线性指示器
动画演示
圆形指示器
线性指示器
支持的平台
Android | iOS | Web | MacOS | Windows | Linux |
---|---|---|---|---|---|
✅ | ✅ | ✅ | ✅ | ✅ | ✅ |
特性
- 创建具有分页视图和进度条的表单。
- 使用进度条或返回按钮在页面之间导航。
- 自定义表单的外观。
- 自定义进度指示器。
- 自定义按钮小部件。
安装
在你的 pubspec.yaml
文件中添加以下依赖项:
dependencies:
form_page_view: ^1.0.0
在Dart文件中导入该包:
import 'package:form_page_view/form_page_view.dart';
使用方法
首先,创建一个表单页面模型(FormPageModel
)列表以定义表单中的页面。每个页面模型应包含一个用于表单验证的 formKey
和表示页面内容的 body
。
final List<FormPageModel> pages = [
FormPageModel(
formKey: GlobalKey<FormState>(),
body: YourFormWidget(),
title: 'Page 1',
textButton: 'Next',
),
// 添加其他页面模型
];
接下来,创建一个 PageController
以控制页面之间的导航:
final PageController _pageController = PageController();
使用 FormPageView
小部件,通过提供页面列表、表单提交时执行的函数以及其他可选参数来自定义表单的外观和行为:
FormPageView(
progress: ProgressIndicatorType.linear,
pages: pages,
onFormSubmitted: () {
// 表单提交时执行的函数
},
controller: _pageController,
),
有关更多详细信息,请参阅示例文件夹中的示例。
属性
属性 | 类型 | 描述 |
---|---|---|
progress | ProgressIndicatorType? | 可选。指定要使用的进度指示器类型,默认为 ProgressIndicatorType.linear 。 |
pages | List<PageModel> | 必需。定义表单页面的页面模型列表。 |
onFormSubmitted | Function() | 必需。表单提交时执行的函数。 |
controller | PageController | 必需。用于控制页面导航的页面控制器。 |
contentPadding | EdgeInsetsGeometry? | 可选。表单页面内容的内边距,默认为 EdgeInsets.all(16) 。 |
buttonPadding | EdgeInsetsGeometry? | 可选。页面导航按钮的内边距,默认为 EdgeInsets.all(16) 。 |
progressPadding | EdgeInsetsGeometry? | 可选。进度指示器的内边距,默认为 EdgeInsets.all(8.0) 。 |
style | FormPageStyle? | 可选。用于自定义表单外观和行为的 FormPageStyle 对象。 |
自定义
表单小部件
你可以通过提供以下参数来自定义表单小部件:
contentPadding
: 表单页面内容的内边距,默认为EdgeInsets.all(16)
。buttonPadding
: 页面导航按钮的内边距,默认为EdgeInsets.all(16)
。progressPadding
: 进度指示器的内边距,默认为EdgeInsets.all(8.0)
。style
: 用于自定义表单外观和行为的FormPageStyle
对象。
表单页面样式
你可以通过提供 FormPageStyle
对象来自定义表单页面样式。可用的参数包括:
backgroundColor
: 表单页面的背景色,默认为Colors.white
。
应用栏
你可以通过提供以下参数来自定义应用栏:
appBarCenterTitle
: 指定是否将应用栏的标题居中,默认为false
。appBarElevation
: 应用栏的阴影高度,默认为4.0
。appBarBackgroundColor
: 应用栏的背景色,默认为Colors.white
。appBarHeight
: 应用栏的高度,默认为56.0
。appBarTextStyle
: 应用栏标题的文字样式,默认为TextStyle(color: Colors.black)
。
进度指示器
你可以通过提供以下参数来自定义进度指示器:
progressIndicatorColor
: 进度指示器的颜色,默认为Colors.blue
。progressIndicatorBackgroundColor
: 进度指示器的背景色,默认为Colors.grey
。progressIndicatorSize
: 进度指示器的大小,默认为48.0
。progressIndicatorStrokeWidth
: 进度指示器的描边宽度,默认为4.0
。
按钮小部件
你可以通过提供以下参数来自定义按钮小部件:
buttonStyle
: 页面导航按钮的样式,默认为ElevatedButton.styleFrom(primary: Colors.blue)
。buttonHeight
: 页面导航按钮的高度,默认为48
。buttonWidth
: 页面导航按钮的宽度,默认为double.infinity
。buttonTextStyle
: 页面导航按钮的文字样式,默认为TextStyle(color: Colors.white)
。backButtonIcon
: 返回按钮的图标,默认为Icons.arrow_back
。
作者
示例代码
// ignore_for_file: avoid_print
import 'package:flutter/material.dart';
import 'package:form_page_view/enum/progress_enum.dart';
import 'package:form_page_view/models/form_page_model.dart';
import 'package:form_page_view/form_page_view.dart';
import 'package:form_page_view/models/form_page_style.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
debugShowCheckedModeBanner: false,
theme: ThemeData(
scaffoldBackgroundColor: Colors.white,
primarySwatch: Colors.blue,
),
home: const MyHomePage(),
);
}
}
class MyHomePage extends StatelessWidget {
const MyHomePage({super.key});
[@override](/user/override)
Widget build(BuildContext context) {
// 表单键
final GlobalKey<FormState> formKeyPage1 = GlobalKey<FormState>();
final GlobalKey<FormState> formKeyPage2 = GlobalKey<FormState>();
final GlobalKey<FormState> formKeyPage3 = GlobalKey<FormState>();
// 控制器
final emailController = TextEditingController();
final usernameController = TextEditingController();
final firstNameController = TextEditingController();
final lastNameController = TextEditingController();
// 创建一个表示表单页面的 FormPageModel 对象列表
final pages = [
FormPageModel(
formKey: formKeyPage1,
title: 'Page 1',
textButton: 'Next',
body: Form(
key: formKeyPage1,
child: Column(
children: [
const SizedBox(height: 20),
TextFormField(
controller: usernameController,
decoration: const InputDecoration(labelText: 'Username'),
validator: (value) {
if (value == null || value.isEmpty) {
return 'Please enter a username';
}
return null;
},
)
],
),
),
),
FormPageModel(
formKey: formKeyPage2,
title: 'Page 2',
textButton: 'Next',
body: Form(
key: formKeyPage2,
child: Column(
children: [
const SizedBox(height: 20),
TextFormField(
controller: firstNameController,
decoration: const InputDecoration(labelText: 'First Name'),
validator: (value) {
if (value == null || value.isEmpty) {
return 'Please enter your first name';
}
return null;
},
),
const SizedBox(height: 20),
TextFormField(
controller: lastNameController,
decoration: const InputDecoration(labelText: 'Last Name'),
validator: (value) {
if (value == null || value.isEmpty) {
return 'Please enter your last name';
}
return null;
},
),
],
),
),
),
FormPageModel(
formKey: formKeyPage3,
title: 'Page 3',
textButton: 'Next',
body: Form(
key: formKeyPage3,
child: Column(
children: [
const SizedBox(height: 20),
TextFormField(
controller: emailController,
decoration: const InputDecoration(labelText: 'Email'),
validator: (value) {
if (value == null || value.isEmpty) {
return 'Please enter your email';
}
return null;
},
),
],
),
),
),
];
const style = FormPageStyle(
backgroundColor: Colors.white,
buttonHeight: 60,
);
return FormPageView(
controller: PageController(),
progress: ProgressIndicatorType.circular,
pages: pages,
style: style,
onFormSubmitted: () {
// 打印所有值
print('Username: ${usernameController.text}');
print('First Name: ${firstNameController.text}');
print('Last Name: ${lastNameController.text}');
print('Email: ${emailController.text}');
},
);
}
}
更多关于Flutter表单页面管理插件form_page_view的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter表单页面管理插件form_page_view的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,form_page_view
是一个 Flutter 插件,用于在分页视图中管理表单。它允许开发者将表单分成多个页面,并且轻松地在页面之间导航和收集数据。以下是一个如何使用 form_page_view
的简单示例代码。
首先,确保在你的 pubspec.yaml
文件中添加 form_page_view
依赖:
dependencies:
flutter:
sdk: flutter
form_page_view: ^x.y.z # 替换为最新版本号
然后,运行 flutter pub get
来获取依赖。
下面是一个完整的示例代码,展示了如何使用 form_page_view
创建一个多页表单:
import 'package:flutter/material.dart';
import 'package:form_page_view/form_page_view.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('FormPageView Demo'),
),
body: MyFormPageView(),
),
);
}
}
class MyFormPageView extends StatefulWidget {
@override
_MyFormPageViewState createState() => _MyFormPageViewState();
}
class _MyFormPageViewState extends State<MyFormPageView> {
final _formKey = GlobalKey<FormPageViewState>();
@override
Widget build(BuildContext context) {
return FormPageView(
key: _formKey,
controller: PageController(),
onSubmit: (values) {
// 收集到的数据
print('Form submitted with values: $values');
},
pages: [
FormPage(
title: 'Page 1',
children: [
TextFormField(
decoration: InputDecoration(labelText: 'Name'),
validator: (value) {
if (value == null || value.isEmpty) {
return 'Please enter your name';
}
return null;
},
onSaved: (value) {
// 保存值到 state
},
),
],
),
FormPage(
title: 'Page 2',
children: [
TextFormField(
decoration: InputDecoration(labelText: 'Email'),
keyboardType: TextInputType.emailAddress,
validator: (value) {
if (value == null || value.isEmpty || !value.contains('@')) {
return 'Please enter a valid email';
}
return null;
},
onSaved: (value) {
// 保存值到 state
},
),
],
),
FormPage(
title: 'Page 3',
children: [
TextFormField(
decoration: InputDecoration(labelText: 'Password'),
obscureText: true,
validator: (value) {
if (value == null || value.isEmpty || value.length < 6) {
return 'Password must be at least 6 characters long';
}
return null;
},
onSaved: (value) {
// 保存值到 state
},
),
],
),
],
);
}
}
在这个示例中:
- 我们创建了一个
FormPageView
,它包含了多个FormPage
。 - 每个
FormPage
包含了一些TextFormField
,并且每个字段都有验证逻辑。 - 当表单提交时,
onSubmit
回调会被调用,并且收集到的值会作为参数传递。
请注意,这个示例中的 onSaved
回调尚未实现保存逻辑。在实际应用中,你可能需要将这些值保存到一个状态管理对象中,或者在提交表单时使用这些值。
此外,你可能还需要处理表单导航(例如,当用户点击“下一步”或“上一页”按钮时),这可以通过在 FormPageView
的外部添加一个控制器来实现,并监听用户的交互事件。不过,form_page_view
插件本身已经提供了基本的分页和导航功能,使得这个过程相对简单。