flutter - 在 Flutter 中等待异步
问题描述
我正在尝试使用 Flutter 编写 Matrix 服务器客户端应用程序。
我从用户所属的服务器请求组。
Future<List> joinedRooms(String accessToken) async {
String url = server + "/_matrix/client/r0/joined_rooms";
Map<String, String> headers = {"Authorization": "Bearer $accessToken"};
Response response = await get(url, headers: headers);
JoinedRooms roomsID = JoinedRooms.fromJson(jsonDecode(response.body));
List names = [];
roomsID.joinedRooms.forEach((roomID) async {
await roomState(accessToken, roomID).then((value) async {
await names.add(value[6].content.name);
});
return names;
});
以下值即将到来response.body
{
"joined_rooms": [
"!JSHWMPAgoJdkQvRQrr:example.com",
"!WzjRnPpUASluIsGTuo: example.com"
]
}
使用该.forEach
方法,我想为每个组 id 请求组的名称并将其添加到names
列表中。
Future<List<RoomState>> roomState(String accessToken, String roomID) async {
String url = server + "/_matrix/client/r0/rooms/$roomID/state";
Map<String, String> headers = {"Authorization": "Bearer $accessToken"};
Response response = await get(url, headers: headers);
List<RoomState> states = (json.decode(response.body) as List).map((i) => RoomState.fromJson(i)).toList();
return states;
}
的列表names
始终为空。async
不等待代码片段。我尝试了很多方法,但都没有成功。
解决方案
您不是在等待在 forEach 中运行的函数
roomsID.joinedRooms.forEach((roomID) async {
await ...
});
await 不起作用,因为 forEach 中的函数没有任何内容可以等待。在DartPad上尝试以下示例
import 'dart:async';
void main() async {
List<int> list = [1, 2, 3];
list.forEach((value) async {
await Future.delayed(Duration(seconds: value));
print('Waited $value');
});
print('Finished main');
}
结果是:
Finished main
Waited 1
Waited 2
Waited 3
因为 forEach 不等待里面的函数。
请尝试:
for(.. in ..) {
await ...
}
推荐阅读
- python - 在wx python中打开子窗口时关闭父窗口
- google-apps-script - 如何使用谷歌脚本将多个范围复制到另一张工作表中的完全相同的位置?
- django - 当调试 = false 时,apache 不服务媒体文件 django
- python-3.x - 如何在 python 中一起使用多个 bigquery 项目
- css - WordPress网站页面和帖子(左右两侧)的填充调整
- excel - 需要很长时间的简单形式的循环公式
- python - 如何为每个新循环创建新的屏幕截图?
- javascript - 为什么登录后没有重新渲染?
- c# - 使用属性覆盖数据模型约定
- hyperledger-fabric - 为 Raft 生成 orderer genesis block 返回不明确的日志