为何Supabase数据转换后Future返回[[], []]而非预期用户/帖子列表?
问题排查与解决方案
核心问题
从Firebase切换到自托管Supabase后,已成功获取List<Map<String, dynamic>>格式的userDocs和postsDocs,但遍历转换时出现异常:
- 用户处理循环仅执行一次打印后终止
- 帖子处理循环完全未执行
- 最终返回空的
usersList和postsList
大概率原因
转换UserSearchResult或Post对象时触发了未捕获的异常,导致循环中断。Supabase与Firebase返回的数据结构存在差异(如字段名、数据类型不同),原适配Firebase的fromJson构造函数无法兼容Supabase数据,抛出异常后直接终止循环。
排查与修复步骤
1. 给转换逻辑添加异常捕获
在循环内包裹try-catch,定位具体的转换错误:
List<UserSearchResult> usersList = []; for (var json in userDocs) { try { print('New user json: $json'); final user = UserSearchResult.fromJson(json); usersList.add(user); print('用户转换成功: ${user.id}'); } catch (e, stackTrace) { print('解析用户失败: $json, 错误信息: $e'); print('堆栈跟踪: $stackTrace'); } } List<Post> postsList = []; for (var json in postsDocs) { try { print('New post json: $json'); final post = Post.fromJson(json); postsList.add(post); print('帖子转换成功: ${post.id}'); } catch (e, stackTrace) { print('解析帖子失败: $json, 错误信息: $e'); print('堆栈跟踪: $stackTrace'); } }
2. 对比Supabase与Firebase的数据结构差异
常见差异点:
- 字段名:Firebase用
uid标识用户ID,Supabase默认用id - 时间字段:Firebase返回
Timestamp类型,Supabase返回ISO格式字符串或DateTime - 嵌套数据:Supabase的关联数据格式可能与Firebase的子文档不同
根据捕获的错误信息,修改UserSearchResult.fromJson和Post.fromJson构造函数,适配Supabase的数据格式:
// 示例:适配Supabase用户ID字段 class UserSearchResult { final String id; final String name; UserSearchResult({required this.id, required this.name}); factory UserSearchResult.fromJson(Map<String, dynamic> json) { return UserSearchResult( id: json['id'] as String, // 替换Firebase的json['uid'] name: json['name'] as String, ); } }
3. 确认postsDocs的有效性
打印postsDocs.length确认是否为空列表:
print('帖子数据量: ${postsDocs.length}');
如果为空,检查Supabase查询语句是否正确,确保能返回预期的帖子数据。
验证
修改后重新运行,通过打印日志确认:
- 所有用户/帖子数据都进入循环
- 转换成功的对象被正确添加到列表
- 错误数据的异常被捕获并打印,不会中断整个循环
内容的提问来源于stack exchange,提问作者Globe
相关产品推荐
相关产品推荐

