Flutter继承问题:NumberTriviaModel不被识别为NumberTrivia实例?
问题分析与修复:模型类继承实体类但测试不通过
问题背景
我有两个类:实体类和模型类,模型类继承自实体类,但测试判断模型是否为实体子类时失败。
实体类代码
import 'package:equatable/equatable.dart'; class NumberTrivia extends Equatable { final String text; final int number; const NumberTrivia({ required this.text, required this.number, }); @override List<Object?> get props => [text, number]; }
模型类代码
import '../../domain/entities/number_trivia.dart'; 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, }; } }
测试代码
import 'dart:convert'; import 'package:clean_arch_example_offline/features/number_trivia/data/models/number_trivia_model.dart'; import 'package:flutter_test/flutter_test.dart'; import '../../../../fixtures/fixture_reader.dart'; import '../../domain/entities/number_trivia.dart'; void main() { final tNumberTriviaModel = NumberTriviaModel(number: 1, text: 'Test Text'); test( 'should be a subclass of NumberTrivia entity', () async { expect(tNumberTriviaModel, isA<NumberTrivia>()); }, ); }
报错信息
Expected: <Instance of 'NumberTrivia'> Actual: NumberTriviaModel:<NumberTriviaModel(Test Text, 1)> Which: is not an instance of 'NumberTrivia'
问题原因
测试文件中重复导入了同一个NumberTrivia类:测试代码同时从../../domain/entities/number_trivia.dart和模型类的依赖路径中导入了实体类,导致Dart将其识别为两个不同的类型(即使代码内容完全一致)。这种情况通常因相对路径导入的歧义,或项目路径配置问题引发类的重复加载。
修复方案
删除测试文件中重复的实体类导入
测试只需导入模型类即可,模型类已继承实体类,Dart会自动识别父类类型,无需单独导入实体类。移除不必要的异步标记
该测试为同步断言,async关键字多余,直接移除可避免不必要的异步开销。
修改后的测试代码:
import 'dart:convert'; import 'package:clean_arch_example_offline/features/number_trivia/data/models/number_trivia_model.dart'; import 'package:flutter_test/flutter_test.dart'; import '../../../../fixtures/fixture_reader.dart'; void main() { final tNumberTriviaModel = NumberTriviaModel(number: 1, text: 'Test Text'); test( 'should be a subclass of NumberTrivia entity', () { expect(tNumberTriviaModel, isA<NumberTrivia>()); }, ); }
内容的提问来源于stack exchange,提问作者hewa jalal
相关产品推荐
相关产品推荐

