FlutterウィジェットテストFinderはウィジェットがレンダリングツリーの境界外にあるため失敗します質問する

FlutterウィジェットテストFinderはウィジェットがレンダリングツリーの境界外にあるため失敗します質問する

質問: ウィジェット テスト (flutter_test) を実行するときに、「レンダリング ツリー」の境界を制御するものは何ですか?

私が質問する理由は、非常に基本的なボタンでエラーが発生し、ウィジェットの垂直オフセットが「レンダリング ツリー」の境界外にあるため、ウィジェットが見つからないからです。レンダリング ツリーは 800 x 600 に固定されているようです。

次のメッセージが表示されます:

警告: ファインダー「テキスト「詳細情報」を持つウィジェットが 1 つだけあります (オフステージ ウィジェットは無視されます): Text("詳細情報", 依存関係: [MediaQuery, DefaultTextStyle])」を使用した tap() の呼び出しにより、Offset (オフセット(400.0, 641.8)) は、指定されたウィジェットでヒットテストを実行しません。ウィジェットが実際には画面外にあるか、別のウィジェットに隠れているか、ウィジェットがポインターイベントを受信できない可能性があります。オフセット (400.0, 641.8) は、レンダリング ツリーのルート、サイズ (800.0, 600.0) の境界外にあります。ファインダーはこの RenderBox に対応します: RenderParagraph#1b6b1 relayoutBoundary=up27 そのオフセットでのヒット テストの結果は次のとおりです: HitTestResult(HitTestEntry#b18dd(RenderView#408c3), HitTestEntry#a2393()) #0 WidgetController._getElementPoint (package:flutter_test/src/controller.dart:953:25) #1 WidgetController.getCenter (package:flutter_test/src/controller.dart:836:12) #2 WidgetController.tap (package:flutter_test/src/controller.dart:271:18) #3 main. (file:///Users/tommy/Repos/surveyapp/survey/test/widget_test.dart:99:18)

そのエラー メッセージのレンダリング ツリーのサイズは 800 x 600 です。(どのように設定されているのか、またその理由はわかりません。ちょうど 800x600 であることが不思議です。どこかで設定されているのでしょう。Web プロジェクトがあり、テストを実行すると何らかの理由でそのサイズにデフォルト設定されているためでしょうか)。オフセットの高さが 600 を超えるウィジェットは、テストでは見つかりません。画面は、iOS エミュレーターおよび Flutter Web の Chrome で正常に動作します。開発ツールのウィジェット インスペクターを使用すると、レイアウトの問題はありません。これは、単純なステートフル ウィジェット ページの一部として、祖先の列、パディング、中央、セーフエリア、およびスキャフォールドを持つボタンにすぎません。

(Flutter バージョン 2.12 以降でこの問題が発生しました。)

ベストアンサー1

テスト中にボタンをタップしたときにも同じ問題が発生しました。

800x600のサイズを変更する方法がわかりませんが、この回答のおかげでボタンまでスクロールする方法を見つけることができましたhttps://stackoverflow.com/a/67990754/992201

最終的なコードは次のとおりです。

final Finder buttonToTap = find.byKey(const Key('keyOfTheButton'));

await tester.dragUntilVisible(
  buttonToTap, // what you want to find
  find.byType(SingleChildScrollView), // widget you want to scroll
  const Offset(0, 50), // delta to move
);
await tester.tap(buttonToTap);
await tester.pump();

おすすめ記事