等待多个异步任务全部结束
1、使用 Future.wait()
Future<void> fetchData() async {
try {
var response1 = http.get(Uri.parse('https://example.com/data1'));
var response2 = http.get(Uri.parse('https://example.com/data2'));
var results = await Future.wait([response1, response2]);
var data1 = jsonDecode(results[0].body);
var data2 = jsonDecode(results[1].body);
print(data1);
print(data2);
} catch (e) {
print('Error: $e');
}
}
2、使用 Stream 和 StreamController:Stream 和 StreamController 是 Dart 中用于处理流的类,它们可以用于实现多个异步请求的并发处理和结果组合。我们可以创建多个 StreamController,并将它们的流合并到一个单独的流中,然后使用 Stream 的各种操作符来处理结果。
Future<void> fetchData() async {
try {
var controller1 = StreamController();
var controller2 = StreamController();
http.get(Uri.parse('https://example.com/data1'))
.then((response) => controller1.add(response.body));
http.get(Uri.parse('https://example.com/data2'))
.then((response) => controller2.add(response.body));
var results = await StreamZip([controller1.stream, controller2.stream]).toList();
var data1 = jsonDecode(results[0]);
var data2 = jsonDecode(results[1]);
print(data1);
print(data2);
} catch (e) {
print('Error: $e');
}
}
等待组件渲染完成
@override
void initState() {
super.initState();
WidgetsBinding.instance?.addPostFrameCallback((timeStamp) {
showDialog(
context: context,
builder: (context) {
return const AlertDialog(
title: Text('AlertDialog'),
);
});
});
print("initState-------");
}
生命周期阶段执行的函数
1、initState
调用次数:1次
插入渲染树时调用,只调用一次,widget创建执行的第一个方法,这里可以做一些初始化工作,比如初始化State的变量。
2、didChangeDependencies
调用次数:多次
初始化时,在initState()之后立刻调用
当依赖的InheritedWidget rebuild,会触发此接口被调用
实测在组件可见状态变化的时候会调用
3、build
调用次数:多次
初始化之后开始绘制界面
setState触发的时候会
4、didUpdateWidget
调用次数:多次
组件状态改变时候调用
5、deactivate
当State对象从树中被移除时,会调用此回调,会在dispose之前调用。
页面销毁的时候会依次执行:deactivate > dispose
6、dispose
调用次数:1次
![](https://img.haomeiwen.com/i2510972/4a4cf9aaef7cefd2.png)
监听app生命周期
class xxx with WidgetsBindingObserver
@override
void initState() {
super.initState();
WidgetsBinding.instance?.addObserver(this);
}
@override
void dispose() {
WidgetsBinding.instance?.removeObserver(this);
super.dispose();
}
///监听应用生命周期变化
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
super.didChangeAppLifecycleState(state);
print(':didChangeAppLifecycleState:$state');
switch (state) {
case AppLifecycleState.inactive: // 处于这种状态的应用程序应该假设它们可能在任何时候暂停。
break;
case AppLifecycleState.resumed: //从后台切换前台,界面可见
//fix Android压后台首页状态栏字体颜色变白,详情页状态栏字体变黑问题
changeStatusBar();
break;
case AppLifecycleState.paused: // 界面不可见,后台
break;
case AppLifecycleState.detached: // APP结束时调用
break;
}
}
网友评论