跳至主要内容

TestWidgetsFlutterBinding.clock 更改

摘要

#

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

上下文

#

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

这可能会影响从 TestWidgetsFlutterBinding 获取时钟并将其传递给期望 package:quiver 中的 Clock 的 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:clockClock。这是一个基于多少个地方使用除了从 TestWidgetsFlutterBinding 获取的时钟之外的其他东西调用此 API 的判断。

如果您采用此方法,则传递 tester.binding.clock 的调用站点无需修改,但其他调用站点需要修改。

选项 #3:将 API 更改为接受 DateTime function()

#

如果您仅将 Clock 用于其 now 函数,并且您控制 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