我在Dart编码领域还很新。
我正在使用Sembast(版本2.1.1)并在Flutter中进行编码。 我创建了一个名为ImageItem的抽象类。然后从其他类型的图像继承它,比如说一个ArtworkItem类:
class ArtworkItem extends ImageItem {
DateTime lastUpdated;
String category;
ArtworkItem({
this.lastUpdated,
this.category,
);
static ArtworkItem fromMap(Map<String, dynamic> map) {
return ArtworkItem(
lastUpdated = map['last_updated'],
category = map['category'],
);
}
}
因此,在上面的代码中,ArticleItem具有一个静态方法,该方法从地图返回ArticleItem对象。 然后是一个称为存储库的类。存储库具有一种以Function为参数的方法,并返回一个List。像这样:
List<ImageItem> getImagesFromRepository(ImageItem Function(Map<String, dynamic) fromMap) {
// Do something here to get List of RecordSnapshot object.
// ....Additional code here
final recordSnapshots = await _store.find( await database, finder: finder, );
return recordSnapshot.map((snapshot) => fromMap(snapshot.value));
}
当我在DAO文件中这样调用此方法时:
return getImagesFromRepository(ArtworkItem.fromMap);
我得到了例外:
'MappedListIterable<SembastRecordSnapshot<String, Map<String, dynamic>>, ImageItem>' is not a subtype of type 'List<ImageItem>'
但如果我这样做:
return recordSnapshots
.map(
(snapshot) => ArtworkItem.fromMap(snapshot.value))
.toList();
这有效,仅通过显式指定ArtworkItem.fromMap即可。但这将破坏抽象的目的。
答案 0 :(得分:0)
我只是猜测您的回调没有明确输入。
List<ImageItem> getImagesFromRepository(ImageItem Function(Map<String, dynamic>) fromMap) {}
答案 1 :(得分:0)
DateTime
在sembast中不受支持(它使用不支持DateTime的json)。 lastUpdated
应该/可以转换为int(自时代以来的毫秒数)或ISO8601字符串。
如果您的问题不是我的原因(我假设recordSnapshot的类型为List,而不是RecordSnapshot),为什么您之前没有遇到任何错误。很难说您的应用程序是否像您所说的那样停顿了,或者是否抛出了异常,您可以尝试将其包装为try / catch并打印错误以进行调试。
答案 2 :(得分:0)
@zk_regen,我认为您的getImagesFromRepository
函数期望使用错误的参数。我认为,如果您像这样传递ImageItem
的实例,应该期望ArtworkItem
,
List<ImageItem> getImagesFromRepository(ImageItem imageItem) {
// Do something here to get List of RecordSnapshot object.