概述

#

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

背景

#

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

这可能会影响用户代码,例如以下代码:从 TestWidgetsFlutterBinding 中获取时钟并将其传递给期望 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 的 Clock 创建一个 package:quiver 的 Clock

#

最简单的迁移方法是使用 package:clock 的时钟创建一个 package:quiver 时钟,这可以通过将 .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:clock 中的 Clock。这需要根据有多少地方调用此 API,并且传入的不是从 TestWidgetsFlutterBinding 获取的时钟来判断。

如果采用此方案,那些传入 tester.binding.clock 的调用点将无需修改,但其他调用点需要修改。

方案 #3:将 API 更改为接受一个 DateTime function()

#

如果您只使用 Clocknow 函数,并且您控制该 API,那么您也可以将其更改为直接接受该函数而不是 Clock。这使得它可以通过任何一种 Clock 类型轻松调用,通过传入任何一种时钟的 now 方法的撕裂(tearoff)

迁移前的调用代码

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