dart Flutter记录返回类型问题

cl25kdpy  于 2023-07-31  发布在  Flutter
关注(0)|答案(3)|浏览(164)

这是我目前正在处理的错误:

A value of type '(Null, List<BoatModel>)' can't be returned from the method 'getBoatsFromOwnership' because it has a return type of 'Future<(Failure?, List<Boat>?)>'.

字符串
与此代码相关:

@override
  Future<(Failure?, List<Boat>?)> getBoatsFromOwnership(User user) async {
    try {
      return (null, await boatsDataSource.getBoatsFromOwnership(user.id));
    } on DatabaseException {
      return (DatabaseFailure(), null);
    }
  }


让我困惑的是,这段代码,它做的完全相同,只是对其他数据,工作得很好:

@override
Future<(Failure?, List<Todo>?)> getTodos(Boat boat) async {
    try {
      return (null, await todosDataSource.getTodos(boat.id));
    } on DatabaseException {
      return (DatabaseFailure(), null);
    }
}


return (null, boats)中也出现了同样的问题:

@override
Future<(Failure?, List<Boat>?)> getBoatsFromRelationships(User user, List<Relationship> relationships) async {
    final relationships = await relationshipsRepository.getRelationships(user);
    if (relationships.$1 == DatabaseFailure() || relationships.$2 == null) {
      return (DatabaseFailure(), null);
    }
    final relationshipsIds = relationships.$2!.map((relationship) => relationship.id).toList();
    try {
      final boats = await boatsDataSource.getBoats(
        userId: user.id,
        relationshipIds: relationshipsIds,
      );
      return (null, boats);
    } on DatabaseException {
      return (DatabaseFailure(), null);
    }
}


其他部分也是相同的:
class BoatModel extends Boat
和/或
class TodoModel extends Todo
就像:
Future<List<BoatModel>> getBoatsFromOwnership(String userId);
和/或
Future<List<TodoModel>> getTodos(String boatId);
这当然使用了Dart记录,但是我看不出我的boats和todos代码之间的区别。如果需要任何其他代码来解决这个问题,我很乐意提供更多的代码片段。我不知道是什么导致了这个问题。我当然可以Map类型,但我认为这个问题根本不应该存在。

qzlgjiam

qzlgjiam1#

我怀疑这和Record-s有什么关系。看起来这就是Dart的泛型处理集合的方式,这意味着List<BaseClass>不能存储DerivedClass元素(没有显式强制转换),因为在这种情况下,类层次结构不受尊重。
不知道为什么你的getTodos方法能像预期的那样工作。
请参阅this excellent comment以获得更详细的解释。

w8ntj3qf

w8ntj3qf2#

今天我重新审视了这个问题,因为我想知道为什么相同的代码适用于所有其他模型/实体,但不适用于船。我并排打开这些类并进行比较,在某个时候意识到我曾经在导入中使用了大写,所以是/Boats/而不是/boats/。在我纠正这个问题后,问题得到了解决。但是,没有任何迹象表明导入不正确或丢失。这个错误的原因是我复制了代码,然后用find & replace替换了相关部分。在这样做的过程中,我显然犯了一个大写错误。我们从中学到了什么?不要在自己的代码中复制和粘贴太多。

djp7away

djp7away3#

它的意思正是它所说的。您正在尝试将BoatModel放入Boat提供的空间中。那没用的
您似乎在代码中混淆了Boat和BoatModel。也许你需要摆脱其中的一个。

相关问题