【发布时间】:2023-04-08 06:43:02
【问题描述】:
我有一个小部件类,可以从后端加载用户消息并将其显示在屏幕上。我在小部件类的构建函数中调用我的异步函数getConversations 来获取用户的消息。但我不知道如何等待该功能结束。它在我的构建函数返回空列表后结束。这是我的代码:
获取对话:
Future<List<Conversation>> getConversations(BuildContext context) async {
Map<String,dynamic> conversations;
try{
var getMessagesUrl=Uri.http(BackendBaseURL,'/user/messages/');
print('before post');
var response = await http.post(getMessagesUrl,body:convert.jsonEncode({'id':_userID}));
print('after post');
if(response.statusCode==200){
conversations=convert.jsonDecode(response.body) as Map<String,dynamic>;
print(conversations);
return conversations.entries.map(
(conversation) => Conversation(
conversation.key,
conversation.value.map(
(message) => Message(message['message'],message['sent_by_user'],message['send_date'])
).toList().cast<Message>()
)
).toList();
}
else
showErrorDialog(context, 'Sunucuya bağlanılamadı.');
}
on Exception catch(e){
print(e);
showErrorDialog(context, 'Sunucuya bağlanılamadı.');
}
return [];
}
构建函数:
@override
Widget build(BuildContext context){
List<Conversation> conversations=[];
getConversations(context).then((value) => conversations=value);
print('then: '+conversations.toString());
//Need to wait getConversations function here before continuing
return Scaffold(
appBar: AppBar(
title: Text(this._username),
),
body:Column(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.start,
children: [
]..addAll(conversations),
),
);
}
我的输出是这样的:
I/flutter ( 3034): before post
I/flutter ( 3034): then:[]
I/flutter ( 3034): after post
I/flutter ( 3034): {belkanahmet: [{message: ii sn, sent_by_user: true, send_date: 2021-07-02T15:32:54+03:00}, {message: nbr, sent_by_user: false, send_date: 2021-06-26T21:44:58+03:00}]}
【问题讨论】:
-
@quoci 这解决了我的问题,谢谢!
标签: flutter dart asynchronous http-post