Dart向List<ImageUpdate>添加NewImage报类型不匹配错误如何排查
排查解决步骤
- 第一步:检查列表实际运行时类型是否匹配声明
你可以在添加元素前先打印列表的运行时类型:
90%以上的该类问题都是因为声明的泛型和实际初始化的泛型不匹配,例如你可能写出了如下代码:print(imageUpdates.runtimeType);
Dart泛型支持协变,这种写法编译阶段不会报错,但运行时添加非ExistingImage类型的ImageUpdate子类就会触发类型校验失败。如果打印出来的运行时类型是// 错误写法:声明时是List<ImageUpdate>,但初始化时指定了List<ExistingImage> List<ImageUpdate> imageUpdates = <ExistingImage>[];List<ExistingImage>,直接把初始化部分的泛型改为<ImageUpdate>即可解决。 - 第二步:检查列表赋值逻辑
排查是否存在后续给imageUpdates变量赋值其他列表的逻辑,被赋值的列表如果实际类型是List<ExistingImage>,同样会触发该问题。如果是用var/final自动推断类型声明的列表,检查初始值是否触发了类型收窄:
这种情况需要显式指定泛型:// 错误写法:初始值只有ExistingImage实例,Dart会自动推断类型为List<ExistingImage> final imageUpdates = [ExistingImage()];final imageUpdates = <ImageUpdate>[ExistingImage()]; - 第三步:核对类的继承实现关系
确认三个类的定义符合你的设计预期,没有出现拼写错误、继承关系写错的问题:abstract class ImageUpdate {} // 确认NewImage确实实现/继承了ImageUpdate,没有误继承ExistingImage class NewImage implements ImageUpdate {} class ExistingImage implements ImageUpdate {} - 第四步:排查操作的列表变量是否正确
确认你执行添加操作的列表,就是你声明的List<ImageUpdate>类型的变量,没有出现操作了同作用域内另一个List<ExistingImage>类型同名变量的问题。
内容的提问来源于stack exchange,提问作者Richard Robinson
相关产品推荐
相关产品推荐

