Appwrite Dart调用listCollections返回null及类型报错问题
故障根因
该报错由dart_appwrite客户端SDK与EC2上自托管的Appwrite服务端版本不匹配引发,并非接口真实返回null。
高版本SDK的CollectionList.fromMap解析逻辑强制要求接口返回的total字段为int类型,而你部署的低版本Appwrite服务端在listCollections接口的返回结果中未携带该字段(或字段值为null),直接触发type 'Null' is not a subtype of type 'int'类型转换异常,中断整个返回结果的解析流程,最终表现为无法拉取集合列表。
创建集合、写入文档操作不受影响,是因为单资源的写、查接口字段结构跨小版本变动极小,不会触发这类解析错误;仅列表类接口新增分页统计字段后,才会出现这类跨版本不兼容问题。
修复方案
按优先级选择对应操作即可:
- 对齐SDK与服务端版本(推荐)
登录EC2实例,进入Appwrite的docker-compose部署目录,执行docker ps | grep appwrite/appwrite查看当前运行的Appwrite服务端版本号;随后在Flutter项目的pubspec.yaml中,将dart_appwrite的版本调整为与服务端大版本完全匹配的版本,禁止跨大版本引用SDK(例如服务端为1.3.x版本时,不要使用1.4.x及以上版本的SDK),调整后执行flutter pub get拉取对应版本依赖即可恢复。 - 临时规避方案(无需调整SDK版本)
绕过SDK封装的列表解析逻辑,直接调用底层请求方法手动解析返回结果,参考代码:// 不调用SDK封装的Database.listCollections方法,直接发底层请求 final response = await client.call( HttpMethod.get, path: '/database/collections', params: { // 按需传入查询参数,比如limit、offset、search等 'limit': 100, } ); // 手动解析集合列表,跳过CollectionList对total字段的非空校验 final collections = (response.data['collections'] as List) .map((item) => Collection.fromMap(Map<String, dynamic>.from(item))) .toList(); - 自托管实例状态校验
在部署目录执行docker compose ps检查Appwrite所有关联容器的运行状态,确认所有服务状态为healthy。部分旧版本Appwrite后台worker服务异常时,也会导致列表接口漏返回统计字段触发该错误,重启异常容器即可恢复。
内容的提问来源于stack exchange,提问作者aravindha
相关产品推荐
相关产品推荐

