diff --git a/packages/flutter/test/widgets/multi_view_testing.dart b/packages/flutter/test/widgets/multi_view_testing.dart new file mode 100644 index 0000000000..ff20edfd17 --- /dev/null +++ b/packages/flutter/test/widgets/multi_view_testing.dart @@ -0,0 +1,33 @@ +// Copyright 2014 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:ui'; + +import 'package:flutter_test/flutter_test.dart'; + +class FakeView extends TestFlutterView { + FakeView(FlutterView view, { this.viewId = 100 }) : super( + view: view, + platformDispatcher: view.platformDispatcher as TestPlatformDispatcher, + display: view.display as TestDisplay, + ); + + @override + final int viewId; + + @override + void render(Scene scene) { + // Do not render the scene in the engine. The engine only observes one + // instance of FlutterView (the _view), and it is generally expected that + // the framework will render no more than one `Scene` per frame. + } + + @override + void updateSemantics(SemanticsUpdate update) { + // Do not send the update to the engine. The engine only observes one + // instance of FlutterView (the _view). Sending semantic updates meant for + // different views to the same engine view does not work as the updates do + // not produce consistent semantics trees. + } +} diff --git a/packages/flutter/test/widgets/multi_view_tree_updates_test.dart b/packages/flutter/test/widgets/multi_view_tree_updates_test.dart index c8d6c049b8..10fe72f2fd 100644 --- a/packages/flutter/test/widgets/multi_view_tree_updates_test.dart +++ b/packages/flutter/test/widgets/multi_view_tree_updates_test.dart @@ -2,13 +2,13 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import 'dart:ui'; - import 'package:flutter/material.dart'; import 'package:flutter/rendering.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:leak_tracker_flutter_testing/leak_tracker_flutter_testing.dart'; +import 'multi_view_testing.dart'; + void main() { testWidgetsWithLeakTracking('Widgets in view update as expected', (WidgetTester tester) async { final Widget widget = View( @@ -209,14 +209,3 @@ Future pumpWidgetWithoutViewWrapper({required WidgetTester tester, require tester.binding.scheduleFrame(); return tester.binding.pump(); } - -class FakeView extends TestFlutterView{ - FakeView(FlutterView view, { this.viewId = 100 }) : super( - view: view, - platformDispatcher: view.platformDispatcher as TestPlatformDispatcher, - display: view.display as TestDisplay, - ); - - @override - final int viewId; -} diff --git a/packages/flutter/test/widgets/tree_shape_test.dart b/packages/flutter/test/widgets/tree_shape_test.dart index ab1c97ff92..986c8be3e7 100644 --- a/packages/flutter/test/widgets/tree_shape_test.dart +++ b/packages/flutter/test/widgets/tree_shape_test.dart @@ -9,6 +9,8 @@ import 'package:flutter/rendering.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:leak_tracker_flutter_testing/leak_tracker_flutter_testing.dart'; +import 'multi_view_testing.dart'; + void main() { testWidgetsWithLeakTracking('Providing a RenderObjectWidget directly to the RootWidget fails', (WidgetTester tester) async { // No render tree exists to attach the RenderObjectWidget to. @@ -1149,14 +1151,3 @@ Future pumpWidgetWithoutViewWrapper({required WidgetTester tester, require tester.binding.scheduleFrame(); return tester.binding.pump(); } - -class FakeView extends TestFlutterView{ - FakeView(FlutterView view, { this.viewId = 100 }) : super( - view: view, - platformDispatcher: view.platformDispatcher as TestPlatformDispatcher, - display: view.display as TestDisplay, - ); - - @override - final int viewId; -} diff --git a/packages/flutter/test/widgets/view_test.dart b/packages/flutter/test/widgets/view_test.dart index 2fe695f0ae..612ca66b81 100644 --- a/packages/flutter/test/widgets/view_test.dart +++ b/packages/flutter/test/widgets/view_test.dart @@ -9,6 +9,8 @@ import 'package:flutter/rendering.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:leak_tracker_flutter_testing/leak_tracker_flutter_testing.dart'; +import 'multi_view_testing.dart'; + void main() { testWidgetsWithLeakTracking('Widgets running with runApp can find View', (WidgetTester tester) async { FlutterView? viewOf; @@ -456,17 +458,6 @@ Future pumpWidgetWithoutViewWrapper({required WidgetTester tester, require return tester.binding.pump(); } -class FakeView extends TestFlutterView{ - FakeView(FlutterView view, { this.viewId = 100 }) : super( - view: view, - platformDispatcher: view.platformDispatcher as TestPlatformDispatcher, - display: view.display as TestDisplay, - ); - - @override - final int viewId; -} - class SpyRenderWidget extends SizedBox { const SpyRenderWidget({super.key, required this.label, required this.log, super.child}); diff --git a/packages/flutter_test/test/multi_view_accessibility_test.dart b/packages/flutter_test/test/multi_view_accessibility_test.dart index c070ad6310..f93ba4b756 100644 --- a/packages/flutter_test/test/multi_view_accessibility_test.dart +++ b/packages/flutter_test/test/multi_view_accessibility_test.dart @@ -3,11 +3,12 @@ // found in the LICENSE file. import 'dart:convert'; -import 'dart:ui'; import 'package:flutter/material.dart'; import 'package:flutter_test/flutter_test.dart'; +import 'multi_view_testing.dart'; + void main() { testWidgets('Detects tap targets in all views', (WidgetTester tester) async { final SemanticsHandle handle = tester.ensureSemantics(); @@ -122,14 +123,3 @@ Future pumpViews({required WidgetTester tester, required List vie tester.binding.scheduleFrame(); return tester.binding.pump(); } - -class FakeView extends TestFlutterView{ - FakeView(FlutterView view, { this.viewId = 100 }) : super( - view: view, - platformDispatcher: view.platformDispatcher as TestPlatformDispatcher, - display: view.display as TestDisplay, - ); - - @override - final int viewId; -} diff --git a/packages/flutter_test/test/multi_view_controller_test.dart b/packages/flutter_test/test/multi_view_controller_test.dart index 6d74d924c1..a9488933d7 100644 --- a/packages/flutter_test/test/multi_view_controller_test.dart +++ b/packages/flutter_test/test/multi_view_controller_test.dart @@ -2,12 +2,12 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import 'dart:ui'; - import 'package:flutter/rendering.dart'; import 'package:flutter/widgets.dart'; import 'package:flutter_test/flutter_test.dart'; +import 'multi_view_testing.dart'; + void main() { testWidgets('simulatedAccessibilityTraversal - start and end in same view', (WidgetTester tester) async { await pumpViews(tester: tester); @@ -219,14 +219,3 @@ Future pumpViews({required WidgetTester tester}) { tester.binding.scheduleFrame(); return tester.binding.pump(); } - -class FakeView extends TestFlutterView{ - FakeView(FlutterView view, { this.viewId = 100 }) : super( - view: view, - platformDispatcher: view.platformDispatcher as TestPlatformDispatcher, - display: view.display as TestDisplay, - ); - - @override - final int viewId; -} diff --git a/packages/flutter_test/test/multi_view_testing.dart b/packages/flutter_test/test/multi_view_testing.dart new file mode 100644 index 0000000000..ff20edfd17 --- /dev/null +++ b/packages/flutter_test/test/multi_view_testing.dart @@ -0,0 +1,33 @@ +// Copyright 2014 The Flutter Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'dart:ui'; + +import 'package:flutter_test/flutter_test.dart'; + +class FakeView extends TestFlutterView { + FakeView(FlutterView view, { this.viewId = 100 }) : super( + view: view, + platformDispatcher: view.platformDispatcher as TestPlatformDispatcher, + display: view.display as TestDisplay, + ); + + @override + final int viewId; + + @override + void render(Scene scene) { + // Do not render the scene in the engine. The engine only observes one + // instance of FlutterView (the _view), and it is generally expected that + // the framework will render no more than one `Scene` per frame. + } + + @override + void updateSemantics(SemanticsUpdate update) { + // Do not send the update to the engine. The engine only observes one + // instance of FlutterView (the _view). Sending semantic updates meant for + // different views to the same engine view does not work as the updates do + // not produce consistent semantics trees. + } +}