【问题标题】:How do I fix 'type '() => T' is not a subtype of type 'T' in type cast'如何修复'类型'()=> T'不是类型转换中'T'类型的子类型'
【发布时间】:2019-05-07 15:10:13
【问题描述】:

我正在手动设置一个带有 json(反)序列化的模型类。到目前为止,我已经实现了一些测试用例。特别是我检查 toJson -> fromJson 是否是我称为 Session 的模型类型的标识。

这是我的模型类型的相关部分:

class Session extends Equatable {
  final List<User> audience;

/* ... */

  Session.fromJson(Map<String, dynamic> json) :
        /* ... */
         audience = (json['audience'] as List).map(((it) => 
              User.fromMap(it))).toList();

  Map<String, dynamic> toJson() => {
      /* ... */
      'audience': audience.map((it) => it.toJson()).toList()
    };
}

这些是audience 字段中的类型:

class User extends Equatable {
  factory User.fromJson(Map<String, dynamic> json) {
    if (_isRegisteredUserJson(json)) {
      return RegisteredUser.fromMap(json);
    } else {
      return User(id: json['id']);
    }
  } 

/* ... */
}

class RegisteredUser extends User {/* ... */}

在我的测试中,我设置了观众字段(使用faker 库),如下所示:


User _user() => User(id: faker.guid.guid());

RegisteredUser _registeredUser() => RegisteredUser(
    id: faker.guid.guid(),
    alias: faker.person.name(),
    email: faker.internet.email());


Session _session => Session(
    audience: faker.randomGenerator
        .amount((n) => n % 3 == 0 ? _registeredUser() : _user, 100)
        .cast<User>()
/* ... */
);

我希望audience 列表在toJson() 返回后仅包含UserRegisteredUser 类型的元素。相反,我得到一个包含RegisteredUsers_Closure: () =&gt; 'User from Function' 的列表,我不确定那是什么。 结果,我的测试收到以下错误消息:

00:00 +4 -1: toJson -> fromJson is identity for Session [E]
  type '() => User' is not a subtype of type 'User' in type cast
  dart:_internal/cast.dart 99:46                     _CastListBase.[]
  dart:collection/list.dart 60:33                    __CastListBase&_CastIterableBase&ListMixin.elementAt
  dart:_internal/iterable.dart 414:40                MappedListIterable.elementAt
  dart:_internal/iterable.dart 219:19                ListIterable.toList
  package:feedback/model/base_module.dart 42:54      BaseModule.toJson
  package:feedback/model/session.dart 51:23          Session.toJson
  test/json_test.dart 34:47                          main.<fn>.<fn>
  package:test_api/src/backend/declarer.dart 168:27  Declarer.test.<fn>.<fn>.<fn>
  ===== asynchronous gap ===========================
  dart:async/future_impl.dart 22:43                  _Completer.completeError
  dart:async/runtime/libasync_patch.dart 40:18       _AsyncAwaitCompleter.completeError
  package:test_api/src/backend/declarer.dart         Declarer.test.<fn>.<fn>.<fn>
  ===== asynchronous gap ===========================
  dart:async/zone.dart 1053:19                       _CustomZone.registerUnaryCallback
  dart:async/runtime/libasync_patch.dart 77:23       _asyncThenWrapperHelper
  package:test_api/src/backend/declarer.dart         Declarer.test.<fn>.<fn>.<fn>
  package:test_api/src/backend/invoker.dart 250:15   Invoker.waitForOutstandingCallbacks.<fn>
  ===== asynchronous gap ===========================
  dart:async/zone.dart 1045:19                       _CustomZone.registerCallback
  dart:async/zone.dart 962:22                        _CustomZone.bindCallbackGuarded
  dart:async/timer.dart 52:45                        new Timer
  dart:async/timer.dart 87:9                         Timer.run
  dart:async/future.dart 174:11                      new Future
  package:test_api/src/backend/invoker.dart 399:21   Invoker._onRun.<fn>.<fn>.<fn>

00:00 +4 -1: Some tests failed.

Unhandled exception:
Dummy exception to set exit code.
#0      _rootHandleUncaughtError.<anonymous closure> (dart:async/zone.dart:1112:29)
#1      _microtaskLoop (dart:async/schedule_microtask.dart:41:21)
#2      _startMicrotaskLoop (dart:async/schedule_microtask.dart:50:5)
#3      _Timer._runTimers (dart:isolate/runtime/libtimer_impl.dart:391:30)
#4      _Timer._handleMessage (dart:isolate/runtime/libtimer_impl.dart:416:5)
#5      _RawReceivePortImpl._handleMessage (dart:isolate/runtime/libisolate_patch.dart:171:12)

【问题讨论】:

  • 正如错误所说,您需要返回User 而不是闭包(() =&gt; User)。转到相关行并返回User
  • 首先,去掉这行中不必要的括号:audience = (json['audience'] as List).map(((it) =&gt; User.fromMap(it))).toList();
  • 还有粗箭头(=&gt;) 这里是Map&lt;String, dynamic&gt; toJson() =&gt; { /* ... */ 'audience': audience.map((it) =&gt; it.toJson()).toList() };
  • 抱歉,我没有返回该类型的行(据我所知)。粗箭头是必要的,因为我返回一个 Map 文字。
  • .amount((n) =&gt; n % 3 == 0 ? _registeredUser() : _user, 100) 应该是 .amount((n) =&gt; n % 3 == 0 ? _registeredUser() : _user(), 100) 注意_user 调用上的括号

标签: testing dart flutter json-serialization


【解决方案1】:

感谢 Jordan Davies,答案如下:

在方法调用_user 中,我不小心省略了括号,因此将函数作为参数传递给我想要该函数的结果。

【讨论】:

    猜你喜欢
    • 2020-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-31
    相关资源
    最近更新 更多