Skip to main content

TestWidgetsFlutterBinding.clock 變更

Clock 實作現在來自 package:clock。

摘要

#

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 的 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。 這需要依據有多少地方在呼叫此 API 時, 傳入的不是從 TestWidgetsFlutterBinding 取得的 clock 來判斷。

如果你採用這種做法, 那些傳入 tester.binding.clock 的呼叫端就不需要修改, 但其他呼叫端則需要調整。

選項 #3:將 API 修改為接受 DateTime function()

#

如果你只用 Clocknow 函式, 而且你可以控制這個 API,那麼你也可以直接將它 改為接受該函式本身,而不是 Clock。 這樣一來,不論是哪一種類型的 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