Flutter加载状态管理插件loading_state_handler的使用
Flutter加载状态管理插件loading_state_handler的使用
loading_state_handler
是一个强大的Flutter插件,用于管理UI状态,并内置了重试功能。这个插件优雅地处理了加载、错误、空数据和正常状态,并提供了可定制的重试机制和冷却支持。
特性
- 🔄 智能状态管理(加载、错误、空数据、正常)
- ⏲️ 内置重试机制与可配置冷却时间
- 🎨 为每种状态完全自定义的部件
- 🌐 全局默认配置
- ⚡ 使用常量构造函数优化性能
- 🎯 类型安全回调和构建器
安装
在你的 pubspec.yaml
文件中添加以下依赖:
dependencies:
flutter:
sdk: flutter
loading_state_handler: ^1.3.3
快速开始
设置全局默认值(可选)
LoadingStateHandlerWidget.setDefaults(
defaultRetryCooldown: const Duration(seconds: 5),
defaultLoadingBuilder: (context, loadingMessage) =>
const Center(child: CircularProgressIndicator()),
);
在你的组件中使用
LoadingStateHandlerWidget(
currentState: CurrentStateEnum.error,
errorMessage: 'Failed to load data',
enableRetry: true,
retryCooldown: const Duration(seconds: 3),
onRetry: () => fetchData(),
child: YourWidget(),
);
高级用法
重试机制
包含复杂的重试机制和冷却时间:
LoadingStateHandlerWidget(
currentState: CurrentStateEnum.error,
errorMessage: 'Network error occurred',
enableRetry: true,
retryCooldown: const Duration(seconds: 3),
onRetry: () async {
await refetchData();
},
child: ContentWidget(),
);
全局配置
设置所有实例的默认行为:
LoadingStateHandlerWidget.setDefaults(
defaultRetryCooldown: const Duration(seconds: 5),
defaultLoadingBuilder: (context, message) => CustomLoadingWidget(),
defaultErrorBuilder: (context, message) => CustomErrorWidget(),
defaultEmptyBuilder: (context, message) => CustomEmptyWidget(),
);
状态特定的回调
通过自定义回调处理不同状态:
LoadingStateHandlerWidget(
loading: isLoading,
error: hasError,
empty: isEmpty,
onLoading: (defaultCallback, context, message) {
// 自定义加载行为
},
onError: (defaultCallback, context, message) {
// 自定义错误处理
},
onEmpty: (defaultCallback, context, message) {
// 自定义空状态处理
},
child: ContentWidget(),
);
禁用状态更改
细粒度控制小部件的行为:
LoadingStateHandlerWidget(
disableWidgetChanges: false,
disableErrorWidgetChanges: true,
disableEmptyWidgetChanges: false,
// ...其他属性
);
示例代码
以下是一个完整的示例应用,展示了如何使用 loading_state_handler
插件:
import 'package:flutter/material.dart';
import 'package:loading_state_handler/loading_state_handler.dart';
void main() {
LoadingStateHandlerWidget.setDefaults(
defaultOnData: (context, message) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text(message ?? 'Default Got Data...')),
);
},
defaultOnLoading: (context, message) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text(message ?? 'Default Loading...')),
);
},
defaultLoadingBuilder: (context, loadingMessage) =>
const Center(child: CircularProgressIndicator()),
defaultErrorBuilder: (context, errorMessage, retryWidget, retryCooldown, onRetry) => Center(
child: Text('Custom Error: $errorMessage', style: const TextStyle(color: Colors.red)),
),
defaultEmptyBuilder: (context, emptyMessage) => const Center(
child: Text('No Data Available'),
),
);
runApp(const MyApp());
}
class HomeScreen extends StatefulWidget {
const HomeScreen({super.key});
@override
HomeScreenState createState() => HomeScreenState();
}
class HomeScreenState extends State<HomeScreen> {
bool empty = false;
bool error = false;
String? errorMessage;
bool loading = true;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Loading State Handler Example')),
body: LoadingStateHandlerWidget(
loading: loading,
onLoading: (defaultOnLoading, context, message) {
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text(message ?? 'Custom Loading...')),
);
},
onData: (defaultOnData, context, message) {
defaultOnData?.call(context, message);
ScaffoldMessenger.of(context).showSnackBar(
SnackBar(content: Text(message ?? 'Custom Got Data...')),
);
},
error: error,
errorMessage: errorMessage,
empty: empty,
child: const Center(child: Text('Data Loaded Successfully!')),
),
);
}
@override
void initState() {
super.initState();
Future.delayed(const Duration(seconds: 2), () {
setState(() {
loading = false;
// Uncomment to simulate an error
// error = true;
// errorMessage = "Failed to load data";
// Uncomment to simulate an empty state
// empty = true;
});
});
}
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return const MaterialApp(
home: HomeScreen(),
);
}
}
以上是 loading_state_handler
插件的基本介绍和使用示例,希望对您有所帮助!如果您需要进一步了解或贡献,请查看其GitHub仓库。
更多关于Flutter加载状态管理插件loading_state_handler的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter加载状态管理插件loading_state_handler的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter应用中使用loading_state_handler
插件进行加载状态管理的示例代码。这个插件允许你更方便地管理加载状态,比如在数据加载时显示加载指示器。
首先,确保你已经在pubspec.yaml
文件中添加了loading_state_handler
依赖:
dependencies:
flutter:
sdk: flutter
loading_state_handler: ^最新版本号 # 请替换为实际最新版本号
然后,运行flutter pub get
来安装依赖。
接下来,是一个简单的示例,展示如何使用loading_state_handler
插件来管理加载状态:
import 'package:flutter/material.dart';
import 'package:loading_state_handler/loading_state_handler.dart';
import 'dart:async';
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> with LoadingStateMixin<String> {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Loading State Handler Example'),
),
body: Center(
child: LoadingStateBuilder<String>(
state: loadingState,
builder: (context, data, child) {
if (loadingState.isLoading) {
return CircularProgressIndicator();
} else if (loadingState.hasError) {
return Text('Error: ${loadingState.error}');
} else {
return Text('Data: $data');
}
},
emptyWidget: Text('No Data'),
),
),
floatingActionButton: FloatingActionButton(
onPressed: () async {
setState(() {
loadingState.setLoading();
});
try {
// Simulate a network request or any asynchronous operation
await Future.delayed(Duration(seconds: 2));
String result = "Fetched Data";
setState(() {
loadingState.setSuccess(result);
});
} catch (e) {
setState(() {
loadingState.setError(e.toString());
});
}
},
tooltip: 'Fetch Data',
child: Icon(Icons.add),
),
);
}
}
代码解释:
-
依赖导入:
- 导入
flutter/material.dart
用于构建UI。 - 导入
loading_state_handler/loading_state_handler.dart
来使用加载状态管理功能。
- 导入
-
主应用:
MyApp
是一个简单的Material应用,包含主题和主页。
-
主页:
MyHomePage
是一个有状态的小部件,它使用LoadingStateMixin<String>
来管理加载状态。泛型String
表示加载成功时的数据类型。
-
构建UI:
- 使用
LoadingStateBuilder
来根据加载状态显示不同的内容。- 如果
isLoading
为真,显示CircularProgressIndicator
。 - 如果
hasError
为真,显示错误信息。 - 否则,显示加载的数据。
- 如果
emptyWidget
属性用于在没有数据时显示的内容。
- 使用
-
浮动操作按钮:
- 点击按钮时,设置加载状态为
isLoading
,然后模拟一个异步操作(例如网络请求)。 - 异步操作成功后,设置加载状态为
setSuccess
并传递数据。 - 如果捕获到异常,设置加载状态为
setError
并传递错误信息。
- 点击按钮时,设置加载状态为
通过这种方式,你可以非常方便地在Flutter应用中管理加载状态,提高用户体验。