Dart异步编程常见应用场景
- 网络请求:在Flutter应用中,与服务器进行数据交互(如获取用户信息、商品列表等)时,由于网络请求可能需要一定时间,使用异步编程可以避免阻塞主线程,确保用户界面保持响应。例如通过
http
库发送HTTP请求获取数据。
- 文件读写操作:当读取或写入较大文件时,操作可能耗时较长。异步编程可使应用在文件操作进行时,继续处理其他任务,如更新UI。
- 数据库操作:无论是本地SQLite数据库还是远程数据库交互,例如查询大量数据,异步操作能防止应用卡顿。
- 动画和过渡效果:一些复杂的动画或过渡效果可能涉及多个步骤且需一定时间完成,异步编程有助于在动画执行过程中保持UI的流畅。
网络请求获取大量数据并展示在列表场景的优化
- 异步获取数据:使用
Future
和async/await
来发起网络请求。例如,假设使用http
库获取数据:
Future<List<dynamic>> fetchData() async {
try {
final response = await http.get(Uri.parse('your_api_url'));
if (response.statusCode == 200) {
return json.decode(response.body);
} else {
throw Exception('Failed to load data');
}
} catch (e) {
throw Exception('Network error: $e');
}
}
- 在UI中展示数据:在
StatefulWidget
中,通过FutureBuilder
来构建UI。FutureBuilder
会根据Future
的状态(未完成、完成、出错)来构建相应的UI。
class DataListScreen extends StatefulWidget {
@override
_DataListScreenState createState() => _DataListScreenState();
}
class _DataListScreenState extends State<DataListScreen> {
@override
Widget build(BuildContext context) {
return FutureBuilder<List<dynamic>>(
future: fetchData(),
builder: (context, snapshot) {
if (snapshot.connectionState == ConnectionState.waiting) {
return Center(child: CircularProgressIndicator());
} else if (snapshot.hasError) {
return Center(child: Text('Error: ${snapshot.error}'));
} else {
final dataList = snapshot.data!;
return ListView.builder(
itemCount: dataList.length,
itemBuilder: (context, index) {
return ListTile(
title: Text(dataList[index]['title']),
// 根据实际数据结构设置其他属性
);
},
);
}
},
);
}
}
- 处理异常情况:
- 网络异常:在
fetchData
函数中,通过try - catch
块捕获网络请求过程中可能出现的异常,如网络连接失败、超时等,并抛出有意义的异常信息。
- HTTP状态码异常:检查HTTP响应的状态码,如果不是200(成功),则抛出异常,提示数据加载失败。
- 数据解析异常:如果
json.decode
在解析响应数据时出错,也会抛出异常。在FutureBuilder
的builder
方法中,通过hasError
判断是否有异常发生,并根据异常情况展示相应的错误提示信息给用户,以提升用户体验。