Flutter UI组件库插件uic的使用
Flutter UI组件库插件uic的使用
UIC (UI Components)
UIC 是一组高级 Flutter UI 组件和独立小部件,用于更轻松地实现常用 UI 功能。
组件:
- StatefulData - 一个可监听的数据模型及其伴随的小部件,用于根据数据状态显示数据。
- ResponsiveLayout - 允许轻松构建适合当前表单因子的布局。
- CheckboxUic - 增强版的复选框,维护其状态,具有标题,并可以在每个状态下显示额外描述。
- ListUic -
ListView
的包装器,实现了相关的数据加载和状态管理逻辑。 - LoginUic - 一个登录表单,隐藏了大多数 UI 逻辑,但仍可自定义以适应您的应用设计。
- ProgressUic -
ProgressIndicator
的包装器,并带有额外文本。
小部件:
- ActionButton -
Material
按钮的包装器,管理操作的状态,并在操作执行时显示进度视图。 - Deck - 显示堆叠卡片,可以展开和折叠。
- InlineTextField - 可内联编辑内容的文本视图。
- StepIndicator - 简单但可定制的步骤/页面指示器。
StatefulData
数据加载和状态通知
StatefulData
是一个包装您的数据的模型,它处理数据加载并通知其监听器数据状态的变化。
StatefulData 模型
final yourStatefulData = StatefulData<YourDataType>(
loader: () => loadData(),
);
一旦创建了 StatefulData
对象,它会使用提供的 loader
函数异步加载数据,并在数据加载状态变化时通知监听器。
您可以控制是否立即开始数据加载:
final yourStatefulData = StatefulData<YourDataType>(
loader: () => loadData(),
startLoading = false,
);
在这种情况下,您可以随时通过调用 loadData()
方法来加载数据:
yourStatefulData.loadData();
此方法还可以用于在任何时候刷新数据。
如果您的数据来自流,可以使用 StatefulData.watch
构造函数:
final yourStatefulData = StatefulData<YourDataType>.watch(
source: () => yourDataStream,
);
在这种情况下,您的数据将自动更新。
StatefulData 支持的数据状态
状态 | 描述 |
---|---|
initialLoading | 第一次加载数据(当前数据为空) |
initialLoadingError | 初始数据加载失败 |
empty | 数据加载成功,但接收到空数据 |
ready | 数据成功加载且值可用 |
loading | 数据正在加载 |
error | 数据加载期间发生错误 |
StatefulDataView 小部件
通常与 StatefulData
一起使用的是 StatefulDataView
。这是一个小部件,监听提供的 StatefulData
对象,并根据当前数据状态更新 UI。
[@override](/user/override)
Widget build(BuildContext context) {
return StatefulDataView<YourDataType>(
statefulData: yourStatefulData,
builder: (context, data) {
return YourDataView(data: data);
}
);
}
在 builder
参数中指定一个返回数据视图的函数,当状态变为 ready
时调用。
可选参数
参数 | 描述 |
---|---|
initialLoadingView | 在初始数据加载期间显示的小部件 |
initialLoadingErrorView | 初始数据加载失败时显示的小部件 |
emptyView | 接收空数据时显示的小部件 |
loadingView | 数据加载期间显示的小部件 |
errorBuilder | 错误时构建小部件的函数 |
StatefulDataView
会在数据状态变化时重建,并根据当前状态显示数据视图或这些视图之一。
如果缺少这些参数,则会显示内置默认视图。
查看 demo app 了解如何使用 StatefulData
模型和 StatefulDataView
小部件的示例。
CheckboxUic
增强版复选框
增强版但仍然简单的复选框小部件。与原始复选框小部件不同,CheckboxUic
维护其状态。它还有标题,并且可以在每个状态下显示额外描述。
使用
导入包:
import 'package:uic/checkbox_uic.dart';
简单使用 CheckboxUic
:
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: CheckboxUic(
initialState: true,
title: '显示附加描述',
description: '这是勾选状态的描述。',
descriptionUnchecked: 'CheckboxUic 可以显示描述文本,该文本可以针对每个状态(勾选和未勾选)单独设置。',
onChanged: (value) {
print('$value');
},
),
);
}
查看更多示例在 demo app。
ListUic
列表组件
几乎每个应用都有显示项目列表的屏幕。这看似简单的任务往往需要实现很多相关功能。所有这些样板代码可以通过 ListUic
小部件简化。
特性:
- 下拉刷新手势以重新加载列表数据
- 分页(无限滚动)在列表末尾滚动时加载下一部分数据
- 初始数据加载进度指示器
- 空数据的独立视图
- 错误视图
- 加载更多项目的进度指示器
- 加载数据失败时显示 Snack Bar
使用
导入包:
import 'package:uic/list_uic.dart';
在页面状态中添加 ListUicController
:
class _MyHomePageState extends State<MyHomePage> {
ListUicController<int> _controller;
[@override](/user/override)
void initState() {
super.initState();
_controller = ListUicController<int>(
onGetItems: (int page) => _getItems(page),
);
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: ListUic<int>(
controller: _controller,
itemBuilder: (item) {
return ListTile(
title: Text('标题 ${item}'),
subtitle: Text('副标题 ${item}'),
);
},
),
);
}
Future<List<int>> _getItems(int page) async {
// 实现获取项目列表的逻辑
}
}
实现一个返回项目列表的函数:
Future<List<int>> _getItems(int page) async {
// 实现获取项目列表的逻辑
}
阅读文档以了解可用的自定义选项。
也可以在 demo app 中检查 ListUic
小部件的详细使用情况。
LoginUic
登录表单
一个登录表单,封装了大多数 ‘登录’ 功能的 UI 逻辑,但仍高度可定制以适应您的应用设计。
特性:
- 显示标准的登录表单,包含用户名和密码字段及 ‘登录’ 按钮
- 实现基本的用户名和密码验证逻辑
- 提供一个回调以执行登录操作
- 处理登录错误
- 允许自定义表单 UI 以适应您的应用设计
使用
导入包:
import 'package:uic/login_uic.dart';
在 widget 树中添加 LoginUic
小部件:
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: LoginUic(
onSignIn: (username, password) => _signIn(username, password),
onSignInCompleted: (context) => Navigator.push(
context,
MaterialPageRoute(
builder: (context) => LoginUicSignedInScreen(title: 'LoginUic Demo'),
),
),
),
),
);
}
Future<void> _signIn(String username, String password) async {
// 实现登录逻辑
}
实现一个根据您的业务逻辑执行登录操作的函数:
Future<void> _signIn(String username, String password) async {
// 实现登录逻辑
}
LoginUic
所需参数:
参数名称 | 描述 |
---|---|
onSignIn | 执行登录操作的回调。当用户点击 ‘登录’ 按钮时调用。 |
onSignInCompleted | 用户成功登录后调用。可以用于导航到另一个屏幕。 |
在 demo app 和包文档中查看完整的 LoginUic
使用示例。
ActionButton
操作按钮
Material
按钮的包装器,封装了执行操作时本地状态的管理,并在操作执行时更新按钮内容以显示进度视图。
使用
导入包:
import 'package:uic/widgets.dart';
您可以像使用普通按钮小部件一样使用 ActionButton
。但是,您应该在 action
属性中提供操作函数,而不是 onPressed
。
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Center(
child: ActionButton(
action: () async {
return Future.delayed(Duration(seconds: 5));
},
child: Text('按钮标题'),
),
),
);
}
ActionButton 额外参数
参数名称 | 描述 |
---|---|
buttonType | 定义基础的 Material 按钮小部件 - TextButton , ElevatedButton 或 OutlineButton 。 |
onActionCompleted | 操作成功完成时调用。 |
onActionError | 操作完成时出现错误时调用。 |
onActionStarted | 按钮被按下后立即调用。 |
progressView | 操作过程中作为按钮子项显示的自定义视图。 |
在 demo app 和包文档中查看完整的 ActionButton
使用示例。
Deck
卡片堆叠
显示堆叠的子小部件(通常是卡片),最初只有标题可见。每个 Deck
项都可以展开和折叠。
使用
导入包:
import 'package:uic/widgets.dart';
通常,您将在 Stack
中使用 Deck
,其中第一层是您的主要内容,而 Deck
将覆盖内容。
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Stack(
children: [
YourMainWidget(),
Align(
alignment: Alignment.bottomCenter,
child: Deck(
items: [
DeckItem(
child: YourFirstItemCollapsedView(),
childExpanded: YourFirstItemExpandedView(),
),
DeckItem(
child: YourSecondItemCollapsedView(),
childExpanded: YourSecondItemExpandedView(),
),
],
),
),
],
),
);
}
您必须提供 DeckItem
对象的列表,这些对象定义了 Deck
项目的折叠和展开外观。
Deck 额外参数
参数名称 | 描述 |
---|---|
collapsedSize | 子小部件在折叠状态下的大小。 |
expandedSize | 子小部件在展开状态下的大小。 |
mainAxisSize | Deck 的最大尺寸。 |
在 demo app 和包文档中查看完整的 Deck
使用示例。
InlineTextField
内联文本字段
使文本视图可编辑。在视图模式下显示普通的 Text
小部件(或自定义视图)。双击时切换到编辑模式,允许用户内联编辑文本。
使用
导入包:
import 'package:uic/widgets.dart';
简单的 InlineTextField
使用:
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Row(
children: [
Text('您可以 '),
InlineTextField(
text: '编辑我',
style: Theme.of(context).textTheme.bodyText1.copyWith(
color: Colors.lightBlueAccent,
),
onEditingComplete: (value) {
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
backgroundColor: Theme.of(context).accentColor,
content: Text(value),
));
},
),
Text(' 在这里'),
],
),
);
}
在 demo app 和包文档中查看更多可用选项的 InlineTextField
示例。
StepIndicator
步骤指示器
简单但可定制的步骤/页面指示器。可用于显示滑块和轮播中的当前项目,或流程中的当前页面,用户必须经过一系列屏幕。
使用
导入包:
import 'package:uic/widgets.dart';
简单的 StepIndicator
使用:
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Padding(
padding: const EdgeInsets.all(16.0),
child: StepIndicator(
selectedStepIndex: 2,
totalSteps: 5,
),
),
);
}
更多关于Flutter UI组件库插件uic的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter UI组件库插件uic的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
uic
是 Flutter 中一个轻量级的 UI 组件库插件,旨在帮助开发者快速构建美观且功能丰富的用户界面。它提供了一系列的预定义组件,可以极大地简化 UI 开发过程。以下是使用 uic
插件的一些基本步骤和示例。
1. 添加依赖
首先,你需要在 pubspec.yaml
文件中添加 uic
的依赖项:
dependencies:
flutter:
sdk: flutter
uic: ^0.0.1 # 请根据实际版本号进行替换
然后,运行 flutter pub get
以获取依赖。
2. 导入包
在你的 Dart 文件中导入 uic
包:
import 'package:uic/uic.dart';
3. 使用组件
uic
提供了多种 UI 组件,你可以直接在代码中使用它们。以下是一些常见组件的示例:
3.1 按钮组件
UicButton(
onPressed: () {
print('Button Pressed');
},
text: 'Click Me',
color: Colors.blue,
textColor: Colors.white,
);
3.2 输入框组件
UicTextField(
hintText: 'Enter your name',
onChanged: (value) {
print('Input: $value');
},
);
3.3 卡片组件
UicCard(
child: Text('This is a card'),
elevation: 5.0,
color: Colors.white,
);
3.4 图标组件
UicIcon(
icon: Icons.favorite,
size: 30.0,
color: Colors.red,
);
3.5 加载指示器
UicLoadingIndicator(
size: 50.0,
color: Colors.blue,
);
4. 自定义主题
uic
允许你自定义主题以适应你的应用风格。你可以在 MaterialApp
中定义一个自定义主题:
MaterialApp(
theme: ThemeData(
primaryColor: Colors.blue,
accentColor: Colors.green,
// 其他自定义主题样式
),
home: MyHomePage(),
);
5. 组合使用
你可以将这些组件组合在一起,构建更复杂的 UI。例如:
class MyHomePage extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('UIC Example'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
UicTextField(
hintText: 'Enter your name',
onChanged: (value) {
print('Input: $value');
},
),
SizedBox(height: 20),
UicButton(
onPressed: () {
print('Button Pressed');
},
text: 'Submit',
color: Colors.blue,
textColor: Colors.white,
),
],
),
),
);
}
}