TestWidgetsFlutterBinding.clock 变更
概述
#TestWidgetsFlutterBinding.clock
现在来自 package:clock
而不是 package:quiver
。
背景
#flutter_test
包正在移除对重量级的 quiver
包的依赖,转而依赖两个更具针对性且更轻量级的包:clock
和 fake_async
。
这可能会影响用户代码,例如:用户从 TestWidgetsFlutterBinding
获取 clock 并将其传递给一个期望来自 package:quiver
的 Clock
的 API,类似如下代码:
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
构造函数来完成。
迁移前的代码
testWidgets('some test', (WidgetTester tester) {
someApiThatWantsAQuiverClock(tester.binding.clock);
});
迁移后的代码
testWidgets('some test', (WidgetTester tester) {
someApiThatWantsAQuiverClock(Clock(tester.binding.clock.now));
});
选项 #2:更改 API 以接受一个 package:clock Clock
#如果您拥有您正在调用的 API,您可能希望将其更改为接受来自 package:clock
的 Clock
。这是一个判断性决定,取决于有多少地方使用非从 TestWidgetsFlutterBinding
检索到的 clock 来调用此 API。
如果您选择此路线,您调用 tester.binding.clock
的调用点将无需修改,但其他调用点则需要。
选项 #3:更改 API 以接受一个 DateTime 函数()
#如果您仅将 Clock
用于其 now
函数,并且您控制该 API,那么您也可以将其更改为直接接受该函数而不是 Clock
。通过传递任一类型 clock 的 now
方法的 tearoff,可以轻松地用这两种类型的 Clock
调用它。
迁移前调用代码
testWidgets('some test', (WidgetTester tester) {
someApiThatWantsAQuiverClock(tester.binding.clock);
});
迁移后调用代码
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