Flutter Dart中Future未等待解析就执行then,无法返回目标列表
问题分析与解决方案
你的问题核心是同步函数无法等待异步操作完成就提前返回:getUsersLikes是普通同步函数,但内部调用的Firestore docRef.get()是异步操作,你用then注册的回调会在主线程空闲时才执行,而外层函数会直接走到最后的return ['Nothing Returned'],导致异步获取到的user_likes根本没机会作为返回值输出。
修正步骤
- 将
getUsersLikes改为异步函数,返回Future<List>类型,这样才能等待异步操作完成 - 用
await替代then链式调用,直接等待Firestore的文档获取操作完成 - 统一用
try-catch捕获异步操作中的异常(原代码的try-catch只能捕获同步错误,无法捕获then回调里的异常) - 调用该函数时必须使用
await,结合late变量需要调整声明方式
修正后的代码
GetUserLikes类
class GetUserLikes { final FirebaseFirestore _firestore = FirebaseFirestore.instance; final user = FirebaseAuth.instance.currentUser!; // 改为异步函数,返回Future<List> Future<List> getUsersLikes() async { try { print('start'); final docRef = _firestore.collection("user_details").doc(user.uid); // 用await等待文档获取完成 final DocumentSnapshot doc = await docRef.get(); final data = doc.data() as Map<String, dynamic>; print("data[user_likes]"); print(data['user_likes']); print('end'); // 直接返回获取到的列表,添加空值兜底避免null return data['user_likes'] ?? []; } catch (err) { print('获取数据出错: $err'); return ['Nothing Returned']; } } }
调用方式(结合late变量)
因为函数返回Future,所以late变量需要适配异步特性,两种常用写法:
// 方式1:直接声明为late Future<List> late Future<List> userLikes = userListLikes.getUsersLikes(); // 方式2:在异步方法中初始化(比如Flutter的initState) late List userLikes; @override void initState() { super.initState(); _initUserLikes(); } void _initUserLikes() async { userLikes = await userListLikes.getUsersLikes(); setState(() {}); // Flutter环境下需调用setState更新UI }
修正后控制台输出顺序
修改后会按预期逻辑输出:
start data[user_likes] [967, 769, 887, 820, 860, 833, 857, 1017] end
内容的提问来源于stack exchange,提问作者JohnnyQ
相关产品推荐
相关产品推荐

