Flutter进度对话框插件flutter_future_progress_dialog的使用
Flutter进度对话框插件flutter_future_progress_dialog的使用
flutter_future_progress_dialog
在等待Future完成的过程中显示带有动画的进度对话框,并在完成后返回该Future的结果。
特性
开始使用
安装库
flutter pub add flutter_future_progress_dialog
导入库
import 'package:flutter_future_progress_dialog/flutter_future_progress_dialog.dart';
使用方法
可以在这里找到完整的示例。
以下是一个简短的例子,展示如何使用showProgressDialog
。
基本用法
在您的函数中调用showProgressDialog
。传递context
和future
参数。然后处理结果。
您还可以使用showCupertinoProgressDialog
来显示带有Cupertino样式的对话框,或使用showAdaptiveProgressDialog
来显示与主机操作系统匹配的对话框。
Future<String> myFuture() async {
await Future.delayed(const Duration(seconds: 2));
return 'my string';
}
Future<void> yourFunction(BuildContext context) async {
final result = await showProgressDialog(
context: context,
future: () => myFuture(),
);
if (!mounted) {
return;
}
switch (result) {
case ResultError(error: final error):
await showDialog(
context: context,
builder: (context) {
return AlertDialog(
content: Text(
'$error',
textAlign: TextAlign.center,
),
actions: [
TextButton(
onPressed: () {
Navigator.of(context).pop();
},
child: const Text(
'OK',
),
),
],
);
},
);
case ResultOk<String>(value: final value):
// value变量将持有'my string'值
break;
}
}
自定义进度对话框
您可以传递一个builder
来自定义进度对话框。
Future<Result<LongRunningTaskResult>> buttonCallback({
required BuildContext context,
}) async {
return await showProgressDialog(
future: () => myLongRunningTask(),
context: context,
builder: (context) => AlertDialog(
content: Text('I am loading now'),
),
);
}
示例代码
以下是完整的示例代码:
import 'package:flutter/material.dart';
import 'package:flutter_future_progress_dialog/flutter_future_progress_dialog.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',
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.deepPurple),
useMaterial3: true,
),
home: const MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
enum DialogType { material, cupertino, adaptive }
class MyHomePage extends StatefulWidget {
const MyHomePage({super.key, required this.title});
final String title;
[@override](/user/override)
State<MyHomePage> createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
int _counter = 0;
Future<int> myFuture(int value) async {
await Future.delayed(const Duration(seconds: 2));
if (value >= 3) {
throw 'Something went wrong';
}
return value + 1;
}
Future<void> _onIncrementCounter({required BuildContext context, required DialogType dialogType}) async {
final result = switch (dialogType) {
DialogType.cupertino => await showCupertinoProgressDialog(
context: context,
future: () => myFuture(_counter),
),
DialogType.material => await showProgressDialog(
context: context,
future: () => myFuture(_counter),
),
DialogType.adaptive => await showAdaptiveProgressDialog(
context: context,
future: () => myFuture(_counter),
),
};
if (!mounted) {
return;
}
switch (result) {
case ResultOk<int>(value: final value):
setState(() {
_counter = value;
});
break;
case ResultError(error: final error):
await showDialog(
context: context,
builder: (context) {
return AlertDialog(
content: Text(
'$error',
textAlign: TextAlign.center,
),
actions: [
TextButton(
onPressed: () {
Navigator.of(context).pop();
setState(() {
_counter = 0;
});
},
child: const Text(
'OK',
),
)
],
);
},
);
}
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
backgroundColor: Theme.of(context).colorScheme.inversePrimary,
title: Text(widget.title),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
Text('Your Future will return result here', style: Theme.of(context).textTheme.bodyLarge),
const SizedBox(height: 4),
Text('counter: $_counter', style: Theme.of(context).textTheme.headlineSmall),
const SizedBox(height: 16),
Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
TextButton(
onPressed: () => _onIncrementCounter(
context: context,
dialogType: DialogType.material,
),
child: const Text('Material'),
),
TextButton(
onPressed: () => _onIncrementCounter(
context: context,
dialogType: DialogType.cupertino,
),
child: const Text('Cupertino'),
),
TextButton(
onPressed: () => _onIncrementCounter(
context: context,
dialogType: DialogType.adaptive,
),
child: const Text('Adaptive'),
),
],
),
],
),
),
);
}
}
更多关于Flutter进度对话框插件flutter_future_progress_dialog的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter进度对话框插件flutter_future_progress_dialog的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter应用中使用flutter_future_progress_dialog
插件来显示进度对话框的示例代码。这个插件允许你显示一个进度对话框,同时执行一个异步任务,并在任务完成后关闭对话框。
首先,你需要在你的pubspec.yaml
文件中添加这个依赖:
dependencies:
flutter:
sdk: flutter
flutter_future_progress_dialog: ^2.0.0 # 请确保版本号是最新的
然后运行flutter pub get
来获取依赖。
接下来,你可以在你的Dart文件中使用这个插件。以下是一个完整的示例,展示了如何使用flutter_future_progress_dialog
来显示一个进度对话框,并在一个模拟的异步任务完成后关闭它。
import 'package:flutter/material.dart';
import 'package:flutter_future_progress_dialog/flutter_future_progress_dialog.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
home: Scaffold(
appBar: AppBar(
title: Text('Flutter Future Progress Dialog Example'),
),
body: Center(
child: ElevatedButton(
onPressed: () async {
// 创建FutureProgressDialog实例
final FutureProgressDialog dialog = FutureProgressDialog(context);
// 显示进度对话框
dialog.ask(
// 这里传递一个Future,表示异步任务
() async {
// 模拟一个耗时操作,例如网络请求
await Future.delayed(Duration(seconds: 3));
},
// 成功回调
onSuccess: (result) {
// 这里可以处理成功后的逻辑,result是Future返回的结果
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
content: Text('任务完成!'),
));
},
// 失败回调
onError: (error, stackTrace) {
// 这里可以处理错误逻辑
ScaffoldMessenger.of(context).showSnackBar(SnackBar(
content: Text('发生错误: $error'),
));
},
);
},
child: Text('开始任务'),
),
),
),
);
}
}
在这个示例中,我们创建了一个简单的Flutter应用,其中包含一个按钮。当用户点击按钮时,会显示一个进度对话框,并且会执行一个模拟的异步任务(使用Future.delayed
来模拟耗时操作)。任务完成后,进度对话框会自动关闭,并显示一个SnackBar通知用户任务已完成。
这个插件非常适合用于处理需要用户等待的异步操作,如网络请求、文件处理等,可以提供更好的用户体验。