Flutter进度构建插件progress_builder的使用
Flutter进度构建插件progress_builder的使用
progress_builder
是一个用于执行简单的异步操作并带有进度/加载指示和内置错误处理的简写构造器。它可以帮助开发者简化异步操作的编写,使其代码更加简洁和易于维护。
功能概述
你可以将这个小部件视为以下代码的简写形式:
SomeButton(
...
onPressed: () async {
onStart...
showLoading...
try {
await doAction... showProgress... 10...20...30...
showLoaded...
onSuccess...
} catch(e) {
onError...
} finally {
onDone...
}
}
...
对于更复杂的情况,建议使用 Cubit
或 Bloc
。
使用示例
下面的示例展示了如何使用 LinearProgressBuilder
:
- 等待
Future.delayed()
- 显示
LinearProgressIndicator
在等待期间 - 如果成功则打印 ‘success’
- 随机抛出异常时打印错误信息
- 无论成功或失败都打印 ‘done’
示例代码
import 'package:flutter/material.dart';
import 'package:progress_builder/progress_builder.dart';
void main() => runApp(const MyApp());
class MyApp extends StatelessWidget {
const MyApp({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) => MaterialApp(
title: 'Progress Builder Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: const Scaffold(
body: MyHomePage(),
),
);
}
class MyHomePage extends StatefulWidget {
const MyHomePage({Key? key}) : super(key: key);
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
bool _fail = true;
String _message = '';
void _showMessage(String message) {
setState(() {
_message = message;
});
}
void _showSnackbar(String message) => ScaffoldMessenger.of(context)
.showSnackBar(SnackBar(content: Text(message)));
@override
Widget build(BuildContext context) => DefaultActionController(
child: Column(
crossAxisAlignment: CrossAxisAlignment.center,
mainAxisAlignment: MainAxisAlignment.center,
children: [
LinearProgressBuilder(
builder: (context, action, error) => Column(
children: [
ElevatedButton(
onPressed: action,
child: const Text(
'50/50 chance of success',
),
),
if (error != null)
Container(
color: Colors.red,
padding: const EdgeInsets.all(16.0),
child: Text(error.toString()),
)
],
),
action: (onProgress) async {
_fail = !_fail;
_showMessage('loading undetermined');
await Future.delayed(const Duration(seconds: 1));
for (final progress in [10, 20, 30, 40, 50, 60, 70, 80, 90]) {
_showMessage('loaded $progress%');
onProgress(progress / 100);
await Future.delayed(const Duration(milliseconds: 200));
}
if (_fail) {
throw Exception('Loading failed');
}
_showMessage('loaded');
},
onDone: () => _showMessage('done'),
onError: (error) => _showSnackbar('error $error'),
onSuccess: () => _showSnackbar('success'),
),
Text(_message),
// We need this to have the DefaultActionController in the context
Builder(
builder: (context) => ElevatedButton(
onPressed: () =>
DefaultActionController.of(context)?.add(ActionType.start),
child: const Text('Trigger action via controller'),
),
)
],
),
);
}
使用与 reactive_forms
结合
progress_builder
还可以与 reactive_forms
结合使用,以下是示例代码:
LinearProgressBuilder(
action: (_) async {
// your action
},
onError: (e) {
// handle your exceptions here
},
onSuccess: () {
// do something
},
builder: (context, action, error) =>
ElevatedButton(
onPressed: (ReactiveForm.of(context)?.valid ?? false) ? action : null,
child: const Text('...your action text'),
),
);
更多关于Flutter进度构建插件progress_builder的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter进度构建插件progress_builder的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
当然,以下是如何在Flutter中使用progress_builder
插件的一个示例代码案例。progress_builder
插件通常用于在加载数据时显示一个进度指示器,直到数据加载完成。
首先,确保你已经在pubspec.yaml
文件中添加了progress_builder
依赖:
dependencies:
flutter:
sdk: flutter
progress_builder: ^^最新版本号(请替换为当前最新版本)
然后运行flutter pub get
来安装依赖。
下面是一个完整的示例代码,展示了如何使用ProgressBuilder
来显示一个进度指示器,并在数据加载完成后显示数据:
import 'package:flutter/material.dart';
import 'package:progress_builder/progress_builder.dart';
import 'dart:async';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'ProgressBuilder Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(),
);
}
}
class MyHomePage extends StatefulWidget {
@override
_MyHomePageState createState() => _MyHomePageState();
}
class _MyHomePageState extends State<MyHomePage> {
Future<String> _fetchData() async {
// 模拟一个耗时操作,例如从网络获取数据
await Future.delayed(Duration(seconds: 3));
return "Data Loaded Successfully!";
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('ProgressBuilder Demo'),
),
body: Center(
child: ProgressBuilder<String>(
future: _fetchData(),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.done) {
// 数据加载完成
if (snapshot.hasError) {
return Text('Error: ${snapshot.error}');
} else {
return Text('${snapshot.data}');
}
} else {
// 数据正在加载
return CircularProgressIndicator();
}
},
),
),
);
}
}
在这个示例中:
MyApp
类是我们的应用入口,它设置了Material主题并指定了主页为MyHomePage
。MyHomePage
是一个有状态组件,它包含一个模拟数据加载的_fetchData
方法,该方法返回一个Future<String>
。- 在
_MyHomePageState
的build
方法中,我们使用了ProgressBuilder
来包裹数据加载逻辑。 ProgressBuilder
接受一个future
参数,这是我们要等待的Future。它还接受一个builder
参数,这是一个函数,用于根据snapshot
的连接状态构建不同的UI。- 当
snapshot.connectionState
为ConnectionState.done
时,我们检查是否有错误,如果没有,则显示加载的数据;否则显示错误信息。 - 当数据正在加载时,我们显示一个
CircularProgressIndicator
。
这个示例展示了如何使用progress_builder
插件来优雅地处理异步数据加载,并提供用户友好的进度指示。