跳至主要內容

TestWidgetsFlutterBinding.clock 變更

摘要

#

現在 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: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