Flutter移除await uploadData()出现List与Iterable类型转换错误求助
Flutter:移除
await uploadData()后出现List<dynamic>' is not a subtype of type 'Iterable<String>错误的原因及解决方法 问题原因
核心是本地存储的持久化数据和泛型类型丢失的问题:
- 调用
uploadData()时,会向GetStorage写入一个明确的List<String>,覆盖掉本地旧数据。此时读取的data实际是List<String>,能被myNames.assignAll()正常接收,不会触发错误。 - 移除
await uploadData()后,读取的是本地遗留的旧数据——这个旧数据是List<dynamic>类型(大概率是之前测试时存入的未指定泛型的列表)。而myNames是List<String>,assignAll()要求参数必须是Iterable<String>,因此触发类型不匹配的错误。
你觉得无论调不调用都应该报错,是忽略了本地存储的持久化特性:调用uploadData会覆盖为正确类型的数据,不调用就会读取旧的错误类型数据。
解决办法
1. 读取时显式指定泛型
调用readData时明确指定泛型为List<String>,强制约束返回类型:
final data = await MyLocalStorage.instance().readData<List<String>>('Names');
2. 手动转换数据类型
如果不确定存储数据的类型,读取后手动将其转换为List<String>:
if(data != null) { myNames.assignAll((data as List).cast<String>()); print("My Names ="+myNames.toString()); }
3. 清理旧存储数据
直接删除App缓存或重新安装App,清除本地遗留的List<dynamic>类型数据,之后只存入List<String>类型数据即可避免问题。
补充说明
GetStorage在序列化存储泛型集合时,会丢失具体的泛型类型信息(比如List<String>会被存为List<dynamic>),所以即使你的readData方法声明了泛型T,也需要显式指定或手动转换,才能保证类型安全。
内容的提问来源于stack exchange,提问作者Irfan Ganatra
相关产品推荐
相关产品推荐

