Flutter:类型 "A" 不是类型 "B" 的 sup 类型,即使 B 扩展了 A

Flutter: Type "A" is not a sup type of type "B" even though B extends A

试图将 class NumberTrivia 的实例分配给 class NumberTriviaModel 的实例,但它给我错误: The argument type 'NumberTrivia' can't be assigned to the parameter type 'NumberTriviaModel'.。所以我试着投射它,但现在我得到了一个未捕获的错误。 Reso 代码之前可以将 NumberTrivia 分配给 NumberTriviaModel。但它是一个较旧的飞镖版本,现在不能以同样的方式完成。现在的主要问题是如何在较新的 dart 版本中这样做。

void main() {
  
  NumberTrivia remoteTrivia = NumberTrivia(text : "Text", number : 5);
  cacheNumberTrivia(remoteTrivia as NumberTriviaModel);
}

class NumberTrivia {
  final String text;
  final int number;

  NumberTrivia({
    required this.text,
    required this.number,
  });


}


class NumberTriviaModel extends NumberTrivia {
  NumberTriviaModel({
    required String text,
    required int number,
  }) : super(text: text, number: number);

  factory NumberTriviaModel.fromJson(Map<String, dynamic> json) {
    return NumberTriviaModel(
      text: json['text'],
      number: (json['number'] as num).toInt(),
    );
  }

  Map<String, dynamic> toJson() {
    return {
      'text': text,
      'number': number,
    };
  }
}

void cacheNumberTrivia(NumberTriviaModel triviaToCache) {
    print(triviaToCache.number);
}

但它给我以下错误

Uncaught Error: TypeError: Instance of 'NumberTrivia': type 'NumberTrivia' is not a subtype of type 'NumberTriviaModel'

向下转换 是不安全的:extending-object 在向下转换时可能有额外的因此缺少的属性。这就是它导致错误的原因。

作为一种替代方法,可以使用一种特殊的构造函数来克隆/复制 object:

void main() {
  NumberTrivia remoteTrivia = NumberTrivia(text: "Text", number: 5);
  cacheNumberTrivia(NumberTriviaModel.copy(remoteTrivia));
}

class NumberTrivia {
  final String text;
  final int number;

  NumberTrivia({
    required this.text,
    required this.number,
  });
}

class NumberTriviaModel extends NumberTrivia {

  NumberTriviaModel.copy(NumberTrivia nt)        // HERE
      : this(text: nt.text, number: nt.number);

  NumberTriviaModel({
    required String text,
    required int number,
  }) : super(text: text, number: number);

  factory NumberTriviaModel.fromJson(Map<String, dynamic> json) {
    return NumberTriviaModel(
      text: json['text'],
      number: (json['number'] as num).toInt(),
    );
  }

  Map<String, dynamic> toJson() {
    return {
      'text': text,
      'number': number,
    };
  }
}

void cacheNumberTrivia(NumberTriviaModel triviaToCache) {
  print(triviaToCache.number);
}

编辑前

Instance of 'NumberTrivia':
  type 'NumberTrivia' is not a subtype of type 'NumberTriviaModel'

这意味着 NumberTrivia 不会扩展 NumberTriviaModel

看代码,正好相反。 NumberTriviaModel 扩展了 NumberTriviaNumberTriviaModel 是一个 sub-type NumberTrivia:

class NumberTriviaModel extends NumberTrivia {
      ! SUBTYPE                 ! TYPE

您的标题是 Type "A" is not a sup type of type "B" even though A extends B。但是代码并没有反映出这一点。

相反,代码可以描述为Type "A" is not a sup type of type "B" BECAUSE B extends A

你调用方法的方式是错误的。这里A扩展了B。如果你想访问A的方法,你需要使用A的实例。如果你在B中添加了方法并试图通过A的实例访问,你可以使用它。

void main() {
  
  NumberTriviaModel remoteTrivia = NumberTriviaModel(text : "Text", number : 5);
  cacheNumberTrivia(remoteTrivia as NumberTriviaModel);
}

class NumberTrivia {
  final String text;
  final int number;

  NumberTrivia({
    required this.text,
    required this.number,
  });


}


class NumberTriviaModel extends NumberTrivia {
  NumberTriviaModel({
    required String text,
    required int number,
  }) : super(text: text, number: number);

  factory NumberTriviaModel.fromJson(Map<String, dynamic> json) {
    return NumberTriviaModel(
      text: json['text'],
      number: (json['number'] as num).toInt(),
    );
  }

  Map<String, dynamic> toJson() {
    return {
      'text': text,
      'number': number,
    };
  }
}

void cacheNumberTrivia(NumberTriviaModel triviaToCache) {
    print(triviaToCache.number);
}