pd_load_state 1.0.0
pd_load_state: ^1.0.0 copied to clipboard
Flutter plugin for request load states (loading/error/empty/success) with enhanced UI, multi-platform support and generic data carrying.
pd_load_state #
这是一个针对网络请求的不同状态对应的 UI 页面封装,
对某一个widget快速添加不同请求状态的 UI 页面,方便快速开发。
This is a UI page encapsulation that corresponds to different states of network requests, allowing for quick addition of UI pages with different request states to a certain 'widget' for easy and rapid development.
功能演示 Feature Demo #
🎨 增强版UI设计 - 支持现代化的加载动画、优雅的渐变效果和流畅的状态转换
📱 多平台支持 - 完美适配 Android、iOS、Web、macOS、Windows、Linux
⚡ 轻量高效 - 简单易用的API设计,快速集成到现有项目
📦 泛型数据携带 - 支持强类型数据传递,成功状态时可直接携带业务数据
安装 Installation #
要使用此包,请将以下内容添加到您的pubspec.yaml文件中:
To use this package, add the following to your pubspec.yaml file:
dependencies:
pd_load_state: ^1.0.0
执行 implement
flutter pub get
用法 Usage #
对于使用示例参考/example文件夹中的代码。
For using examples, refer to the code in the /example folder.
引用pd_load_state库
import 'package:pd_load_state/pd_load_state.dart';
import 'package:pd_load_state/pd_load_state.dart';
简单的使用
Simple use
// 如果想让这个组件展示加载状态,可以按照下面的方式实现。
class SimpleExample extends StatefulWidget {
const SimpleExample({super.key});
@override
State<SimpleExample> createState() => _SimpleExampleState();
}
class _SimpleExampleState extends State<SimpleExample> {
// 初始化组件状态控制对象
// 控制对象默认会执行加载中状态.
final PDLoadState loadState = PDLoadState('SimpleExample');
@override
Widget build(BuildContext context) {
// 使用[PDLoadStateLayout]包裹某一个组件.
return PDLoadStateLayout(
// 必传 绑定的[PDLoadState] 用来控制组件的状态切换。
loadState: loadState,
// 在加载状态时执行的回调, 在这里发送网络请求.
onLoading: network,
// 必传 加载状态成功时要执行的函数, 返回一个要展示的ui组件。
builder: (context) {
return const Center(
child: Text('Simple example'),
);
},
);
}
/// 模仿一次网络请求。
void network() {
Future.delayed(const Duration(seconds: 3)).then((_) {
if (Random().nextBool()) {
// 模拟请求成功, loadState.success() 会让页面回到加载成功状态
// 默认情况下 每次调用这个函数都会刷新[PDLoadStateLayout]包裹的组件
loadState.success();
} else {
loadState.error();
}
});
}
}
组件状态控制对象说明
Description of Component State Control Objects
// 初始化组件状态控制对象
// 控制对象默认会执行加载中状态.
final PDLoadState loadState = PDLoadState('SimpleExample');
// 状态枚举属性
loadState.status;
// 如果是请求错误时的自定义错误文本
loadState.errorMessage;
// 控制对象的身份标识, 用来区分多个组件的状态切换
loadState.identifier;
// 是否刷新[PDLoadStateLayout]包裹的组件.
// 为`true`时, 每次调用函数`loadState.success();`都会刷新[PDLoadStateLayout]包裹的组件
loadState.isRefreshSubviews;
PDLoadState 是一个组件状态控制对象,用来控制组件的状态切换。
如何切换页面的不同状态?
How to switch between different states of a page
// 调用函数切换
// 网络请求成功
loadState.success();
// 网络请求失败
loadState.error();
// 网络请求加载中
loadState.loading();
或者 用状态枚举直接赋值, 内部重写了status的set方法实现刷新.
set status(PDLoadStateEnum newValue) {
_update(newValue);
}
// 网络请求成功
loadState.status = PDLoadStateEnum.success;
// 网络请求失败
loadState.status = PDLoadStateEnum.error;
// 网络请求加载中
loadState.status = PDLoadStateEnum.loading;
loadState.status = PDLoadStateEnum.reload; // 重新加载
各个状态页面的 ui 级别说明
UI level description of each status page
示例 Example loadingWidget
通过[PDLoadStateLayout]类中参数loadingWidgetBuilder设置的 UI, 优先级最高 Highest priority
PDLoadStateLayout(
loadState: loadState,
onLoading: network,
builder: (context) {
return const Center();
},
/// 优先级最高
loadingWidgetBuilder: (context) {
return const Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
mainAxisSize: MainAxisSize.min,
children: [
Text('loading...'),
],
),
);
},
)
PDLoadStateConfigure类配置,设置一次全局使用. 优先级中等 Medium priority
/// 自定义加载中页面
PDLoadStateConfigure.instance.loadingWidgetBuilder = (context) {
return SizedBox(
width: MediaQuery.of(context).size.width,
child: const Center(
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
CircularProgressIndicator(),
Text('加载中...'),
],
),
),
);
};
如果上面两种都没有设置, 则使用默认加载中页面, 优先级最低 Lowest priority
PDLoadStateDefaultWidgets(backgroundColor: backgroundColor).loadingView;
更多详细用法请参考/example/lib/main.dart文件中的代码。
For more detailed usage, please refer to the code in the /example/lib/main.dart.
泛型数据携带 Generic Data Carrying #
从 v0.3.0 开始,插件支持泛型数据携带,可在成功状态时传递强类型数据。
基本用法 Basic Usage #
import 'package:pd_load_state/pd_load_state.dart';
class User {
final String id;
final String name;
User({required this.id, required this.name});
}
class UserProfilePage extends StatefulWidget {
const UserProfilePage({super.key});
@override
State<UserProfilePage> createState() => _UserProfilePageState();
}
class _UserProfilePageState extends State<UserProfilePage> {
// 使用泛型创建状态对象
late PDLoadState<User> _loadState;
@override
void initState() {
super.initState();
_loadState = PDLoadState<User>('user_profile');
_fetchUser();
}
void _fetchUser() {
_loadState.loading();
Future.delayed(const Duration(seconds: 2), () {
final user = User(id: '1', name: '张三');
// 成功时携带数据
_loadState.success(data: user);
});
}
@override
Widget build(BuildContext context) {
return PDLoadStateLayout<User>(
loadState: _loadState,
onErrorRetry: _fetchUser,
// 使用 dataBuilder 接收数据
dataBuilder: (context, user) {
if (user == null) return const Text('无数据');
return Center(
child: Column(
children: [
Text('用户ID: ${user.id}'),
Text('用户名称: ${user.name}'),
],
),
);
},
);
}
}
集合数据 List Data #
late PDLoadState<List<String>> _listLoadState;
void _fetchList() {
_listLoadState.loading();
Future.delayed(const Duration(seconds: 2), () {
_listLoadState.success(data: ['商品A', '商品B', '商品C']);
});
}
PDLoadStateLayout<List<String>>(
loadState: _listLoadState,
dataBuilder: (context, items) {
if (items == null || items.isEmpty) {
return const Text('列表为空');
}
return ListView.builder(
itemCount: items.length,
itemBuilder: (context, index) => ListTile(title: Text(items[index])),
);
},
)
向后兼容 Backward Compatibility #
旧 API 无需修改即可继续使用:
// 旧写法(仍然有效)
PDLoadStateLayout(
loadState: loadState,
builder: (context) => MyContentWidget(),
)
// 新写法(带数据)
PDLoadStateLayout<User>(
loadState: loadState,
dataBuilder: (context, user) => UserProfile(user: user),
)
更多示例请参考 /example/lib/data_demo.dart 文件。
For more examples, please refer to the /example/lib/data_demo.dart file.
API 文档 API Documentation #
核心类 Core Classes #
PDLoadState<T>
支持泛型数据携带的加载状态管理类。
PDLoadState(String id, {PDLoadStateEnum? stateEnum, bool? isRefreshSubviews})- 创建状态实例data- 当前携带的业务数据loading()- 设置为加载中状态success({T? data})- 设置为成功状态并携带数据error({String? msg})- 设置为错误状态empty()- 设置为空数据状态completion()- 设置为完成状态idle()- 设置为初始空闲状态offline()- 设置为离线状态loadingWithProgress(int current, int total, [String? message])- 设置为加载中并显示进度updateProgress(int current, [int? total, String? message])- 更新进度值
PDLoadStateLayout<T>
加载状态布局组件,根据状态自动切换显示不同的 UI 视图。
loadState- 状态管理对象(必填)builder- 成功状态的内容视图构建器(不带数据)dataBuilder- 成功状态的内容视图构建器(带数据)onLoading- 加载状态开始时的回调onErrorRetry- 错误状态重试按钮的回调onOfflineRetry- 离线状态重试按钮的回调loadingWidgetBuilder- 加载状态的自定义视图构建器errorWidgetBuilder- 错误状态的自定义视图构建器emptyWidgetBuilder- 空数据状态的自定义视图构建器completionWidgetBuilder- 完成状态的自定义视图构建器idleWidgetBuilder- 初始空闲状态的自定义视图构建器offlineWidgetBuilder- 离线状态的自定义视图构建器progressBuilder- 进度视图构建器transitionDuration- 状态切换动画的持续时间transitionBuilder- 状态切换动画的构建器
PDLoadStateConfigure
全局配置类,用于统一配置所有加载状态组件的默认行为和样式。
instance- 获取全局配置单例backgroundColor- 全局背景颜色defaultLoadingText- 加载中状态的默认文本defaultErrorText- 错误状态的默认文本defaultEmptyText- 空数据状态的默认文本defaultCompletionText- 完成状态的默认文本defaultIdleText- 初始空闲状态的默认文本defaultOfflineText- 离线状态的默认文本useEnhancedUI- 是否启用增强版 UIloadingWidgetBuilder- 全局加载中视图构建器errorWidgetBuilder- 全局错误视图构建器emptyWidgetBuilder- 全局空数据视图构建器completionWidgetBuilder- 全局完成视图构建器idleWidgetBuilder- 全局初始空闲视图构建器offlineWidgetBuilder- 全局离线视图构建器
状态枚举 State Enum #
PDLoadStateEnum
定义了所有可能的 UI 状态:
success- 请求成功状态error- 请求失败状态loading- 加载中状态empty- 空数据状态reload- 重新加载状态completion- 操作完成状态idle- 初始空闲状态offline- 离线状态
PDLoadStateEnumExtension
提供便捷的状态判断和描述获取:
description- 获取状态的中文描述isLoading- 判断是否为加载中isSuccess- 判断是否为成功isError- 判断是否为错误isEmpty- 判断是否为空数据isCompletion- 判断是否为完成isIdle- 判断是否为初始空闲isOffline- 判断是否为离线isFinalState- 判断是否为终态
国际化 Internationalization #
PDLoadStateLocalizations
加载状态组件的国际化抽象基类,支持中文和英文。
loading- 加载中状态的文本error- 错误状态的文本errorButton- 错误状态重试按钮的文本errorTitle- 错误状态的标题文本empty- 空数据状态的文本emptySubtitle- 空数据状态的副标题文本completion- 完成状态的文本idle- 初始空闲状态的文本offline- 离线状态的文本offlineButton- 离线状态重试按钮的文本offlineTitle- 离线状态的标题文本
PDLoadStateLocalizationsDelegate
国际化代理类,用于加载和管理国际化资源。
工具类 Utility Classes #
PDAccessibilityUtils
无障碍辅助工具类,为加载状态视图添加语义化支持。
loadingSemantics()- 加载中状态的语义化包装errorSemantics()- 错误状态的语义化包装emptySemantics()- 空数据状态的语义化包装completionSemantics()- 完成状态的语义化包装idleSemantics()- 初始空闲状态的语义化包装offlineSemantics()- 离线状态的语义化包装
PDProgressState / PDProgressController
进度管理类,用于管理任务进度。
current- 当前进度值total- 总进度值progress- 进度百分比(0.0 ~ 1.0)update()- 更新进度值reset()- 重置进度到初始状态complete()- 完成进度
状态视图组件 State Widgets #
PDLoadStateDefaultWidgets #
默认加载状态视图组件集合,提供各状态的基础 UI 实现。
loadingView()- 加载中状态视图noDateView()- 空数据状态视图errorView()- 错误状态视图completionView()- 完成状态视图idleView()- 初始空闲状态视图offlineView()- 离线状态视图
PDLoadStateEnhancedWidgets #
增强版加载状态视图组件集合,提供现代化的动画和渐变效果。
loadingView()- 加载中状态视图(增强版)noDateView()- 空数据状态视图(增强版)errorView()- 错误状态视图(增强版)completionView()- 完成状态视图(增强版)idleView()- 初始空闲状态视图(增强版)offlineView()- 离线状态视图(增强版)
支持和社区 Support and Community #
问题反馈 Issue Reporting #
如果您在使用过程中遇到问题或有功能建议,请通过以下方式联系我们:
- 在 GitHub 或 Gitee 上提交 Issue
- 发送邮件至开发者邮箱
贡献指南 Contributing #
我们欢迎社区贡献!如果您想为项目做出贡献,请:
- Fork 项目仓库
- 创建功能分支
- 提交您的更改
- 发起 Pull Request
许可证 License #
此软件包根据 MIT License 获得许可。
This package is licensed under the MIT License .