概述

#

TestWidgetsFlutterBinding.clock 現在來自 package:clock 而不是 package:quiver

背景

#

flutter_test 包正在移除對重量級的 quiver 包的依賴,轉而依賴兩個更具針對性且更輕量級的包:clockfake_async

這可能會影響使用者程式碼,例如:使用者從 TestWidgetsFlutterBinding 獲取 clock 並將其傳遞給一個期望來自 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 建立一個 package:quiver Clock

#

最簡單的遷移方法是,從 package:clock 的 clock 建立一個 package:quiver clock,這可以透過將 .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 檢索到的 clock 來呼叫此 API。

如果您選擇此路線,您呼叫 tester.binding.clock 的呼叫點將無需修改,但其他呼叫點則需要。

選項 #3:更改 API 以接受一個 DateTime 函式()

#

如果您僅將 Clock 用於其 now 函式,並且您控制該 API,那麼您也可以將其更改為直接接受該函式而不是 Clock。透過傳遞任一型別 clock 的 now 方法的 tearoff,可以輕鬆地用這兩種型別的 Clock 呼叫它。

遷移前呼叫程式碼

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