传递返回Dart / Flutter中的对象的函数不起作用

时间:2019-12-05 14:23:53

标签: android ios database flutter dart

我在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即可。但这将破坏抽象的目的。

3 个答案:

答案 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.