概述

#

TestWidgetsFlutterBinding.clock 现在来自 package:clock 而不是 package:quiver

背景

#

flutter_test 包正在移除对重量级的 quiver 包的依赖,转而依赖两个更具针对性且更轻量级的包:clockfake_async

这可能会影响用户代码,例如:用户从 TestWidgetsFlutterBinding 获取 clock 并将其传递给一个期望来自 package:quiverClock 的 API,类似如下代码:

dart
testWidgets('some test', (WidgetTester tester) {
  someApiThatWantsAQuiverClock(tester.binding.clock);
});

迁移指南

#

在此更改后,您可能会看到的错误类似如下:

Error: The argument type 'Clock/*1*/' can't be assigned to the parameter type 'Clock/*2*/'.
 - 'Clock/*1*/' is from 'package:clock/src/clock.dart' ('<pub-cache>/clock/lib/src/clock.dart').
 - 'Clock/*2*/' is from 'package:quiver/time.dart' ('<pub-cache>/quiver/lib/time.dart').

选项 #1:从 package:clock 创建一个 package:quiver Clock

#

最简单的迁移方法是,从 package:clock 的 clock 创建一个 package:quiver clock,这可以通过将 .now 函数的 tearoff 传递给 Clock 构造函数来完成。

迁移前的代码

dart
testWidgets('some test', (WidgetTester tester) {
  someApiThatWantsAQuiverClock(tester.binding.clock);
});

迁移后的代码

dart
testWidgets('some test', (WidgetTester tester) {
  someApiThatWantsAQuiverClock(Clock(tester.binding.clock.now));
});

选项 #2:更改 API 以接受一个 package:clock Clock

#

如果您拥有您正在调用的 API,您可能希望将其更改为接受来自 package:clockClock。这是一个判断性决定,取决于有多少地方使用非从 TestWidgetsFlutterBinding 检索到的 clock 来调用此 API。

如果您选择此路线,您调用 tester.binding.clock 的调用点将无需修改,但其他调用点则需要。

选项 #3:更改 API 以接受一个 DateTime 函数()

#

如果您仅将 Clock 用于其 now 函数,并且您控制该 API,那么您也可以将其更改为直接接受该函数而不是 Clock。通过传递任一类型 clock 的 now 方法的 tearoff,可以轻松地用这两种类型的 Clock 调用它。

迁移前调用代码

dart
testWidgets('some test', (WidgetTester tester) {
  someApiThatWantsAQuiverClock(tester.binding.clock);
});

迁移后调用代码

dart
testWidgets('some test', (WidgetTester tester) {
  modifiedApiThatTakesANowFunction(tester.binding.clock.now);
});

时间线

#

发布版本:1.18.0
稳定版本中:1.20

参考资料

#

API 文档

相关 PR

  • PR 54125: 移除 flutter_test quiver 依赖,改用 fake_async 和 clock