You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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将其识别为两个不同的类型(即使代码内容完全一致)。这种情况通常因相对路径导入的歧义,或项目路径配置问题引发类的重复加载。

修复方案

  1. 删除测试文件中重复的实体类导入
    测试只需导入模型类即可,模型类已继承实体类,Dart会自动识别父类类型,无需单独导入实体类。

  2. 移除不必要的异步标记
    该测试为同步断言,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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 02:20:33