// 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. /// @docImport 'package:flutter/widgets.dart'; library; 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, {Size? size}) { // 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. } } /// A test platform dispatcher that can show/hide its underlying `implicitView`, /// depending on the value of the [implicitViewHidden] flag. class NoImplicitViewPlatformDispatcher extends TestPlatformDispatcher { NoImplicitViewPlatformDispatcher({required super.platformDispatcher}) : superPlatformDispatcher = platformDispatcher; final PlatformDispatcher superPlatformDispatcher; bool implicitViewHidden = false; @override TestFlutterView? get implicitView { return implicitViewHidden ? null : superPlatformDispatcher.implicitView as TestFlutterView?; } } /// Test Flutter Bindings that allow tests to hide/show the `implicitView` /// of their [NoImplicitViewPlatformDispatcher] `platformDispatcher`. /// /// This is used to test that [runApp] throws an assertion error with an /// explanation when used when the `implicitView` is disabled (like in Flutter /// web when multi-view is enabled). /// /// Because of how [testWidgets] uses `runApp` internally to manage the lifecycle /// of a test, the implicitView must be disabled/reenabled inside of the body of /// the [WidgetTesterCallback] under test. In practice: the implicitView is disabled /// in the first line of the test, and reenabled in the last. /// /// See: multi_view_no_implicitView_binding_test.dart class NoImplicitViewWidgetsBinding extends AutomatedTestWidgetsFlutterBinding { late final NoImplicitViewPlatformDispatcher _platformDispatcher = NoImplicitViewPlatformDispatcher(platformDispatcher: super.platformDispatcher); @override NoImplicitViewPlatformDispatcher get platformDispatcher => _platformDispatcher; void hideImplicitView() { platformDispatcher.implicitViewHidden = true; } void showImplicitView() { platformDispatcher.implicitViewHidden = false; } }