为何调用async函数时返回'Future<dynamic>'而非实际返回值?
原因分析
- 所有标记了
async的函数返回值必然是Future类型,只有通过await关键字等待异步执行完成,才能拿到最终的返回值 initState生命周期方法不支持标记为async,不能直接在方法内部使用await调用异步函数- 你直接对
Future实例调用toString(),自然只会得到Instance of Future的输出,函数内部能打印正确值是因为你已经通过await等待Firestore请求完成,拿到了实际的查询结果
修复方案
将异步调用逻辑单独封装,执行完成后通过setState更新界面状态即可,修正后的代码如下:
@override void initState() { super.initState(); userId = _auth.currentUser!.uid; // 单独调用异步加载方法 _loadPublisherSchool(); } // 封装异步加载逻辑 Future<void> _loadPublisherSchool() async { // 用await等待异步函数返回实际结果 String school = await getName(widget.postInfo['publisher-Id'], 'school'); // 更新状态触发界面重绘 setState(() { publisherSchool = school; }); } Future getName(String publisherUid, String fieldname) async { DocumentSnapshot publisherSnapshot = await FirebaseFirestore.instance .collection('users') .doc(publisherUid) .get(); print(publisherSnapshot.get(fieldname)); return publisherSnapshot.get(fieldname); }
额外优化建议
- 可以给
getName函数加上返回值类型声明,避免隐式类型推导带来的问题:Future<String> getName(String publisherUid, String fieldname) async - 建议增加异常捕获逻辑,处理Firestore请求失败的场景,避免应用崩溃
内容的提问来源于stack exchange,提问作者Adrian Alejo
相关产品推荐
相关产品推荐

