TestWidgetsFlutterBinding.clock 变更
概述
#TestWidgetsFlutterBinding.clock
现在来自 package:clock
而不是 package:quiver
。
背景
#flutter_test
包正在移除对较重依赖 quiver
包的依赖,转而依赖于两个更具针对性且更轻量级的包:clock
和 fake_async
。
这可能会影响用户代码,例如以下代码:从 TestWidgetsFlutterBinding
中获取时钟并将其传递给期望 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 的 Clock 创建一个 package:quiver 的 Clock
#最简单的迁移方法是使用 package:clock
的时钟创建一个 package:quiver
时钟,这可以通过将 .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
。这需要根据有多少地方调用此 API,并且传入的不是从 TestWidgetsFlutterBinding
获取的时钟来判断。
如果采用此方案,那些传入 tester.binding.clock
的调用点将无需修改,但其他调用点需要修改。
方案 #3:将 API 更改为接受一个 DateTime function()
#如果您只使用 Clock
的 now
函数,并且您控制该 API,那么您也可以将其更改为直接接受该函数而不是 Clock
。这使得它可以通过任何一种 Clock
类型轻松调用,通过传入任何一种时钟的 now
方法的撕裂(tearoff)
迁移前的调用代码
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