| // 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/rendering.dart'; |
| |
| /// An extension of [RenderingFlutterBinding] that owns and manages a |
| /// [renderView]. |
| /// |
| /// Unlike [RenderingFlutterBinding], this binding also creates and owns a |
| /// [renderView] to simplify bootstrapping for apps that have a dedicated main |
| /// view. |
| class ViewRenderingFlutterBinding extends RenderingFlutterBinding { |
| /// Creates a binding for the rendering layer. |
| /// |
| /// The `root` render box is attached directly to the [renderView] and is |
| /// given constraints that require it to fill the window. The [renderView] |
| /// itself is attached to the [rootPipelineOwner]. |
| /// |
| /// This binding does not automatically schedule any frames. Callers are |
| /// responsible for deciding when to first call [scheduleFrame]. |
| ViewRenderingFlutterBinding({ RenderBox? root }) : _root = root; |
| |
| @override |
| void initInstances() { |
| super.initInstances(); |
| // TODO(goderbauer): Create window if embedder doesn't provide an implicit view. |
| assert(PlatformDispatcher.instance.implicitView != null); |
| _renderView = initRenderView(PlatformDispatcher.instance.implicitView!); |
| _renderView.child = _root; |
| _root = null; |
| } |
| |
| RenderBox? _root; |
| |
| @override |
| RenderView get renderView => _renderView; |
| late RenderView _renderView; |
| |
| /// Creates a [RenderView] object to be the root of the |
| /// [RenderObject] rendering tree, and initializes it so that it |
| /// will be rendered when the next frame is requested. |
| /// |
| /// Called automatically when the binding is created. |
| RenderView initRenderView(FlutterView view) { |
| final RenderView renderView = RenderView(view: view); |
| rootPipelineOwner.rootNode = renderView; |
| addRenderView(renderView); |
| renderView.prepareInitialFrame(); |
| return renderView; |
| } |
| |
| @override |
| PipelineOwner createRootPipelineOwner() { |
| return PipelineOwner( |
| onSemanticsOwnerCreated: () { |
| renderView.scheduleInitialSemantics(); |
| }, |
| onSemanticsUpdate: (SemanticsUpdate update) { |
| renderView.updateSemantics(update); |
| }, |
| onSemanticsOwnerDisposed: () { |
| renderView.clearSemantics(); |
| }, |
| ); |
| } |
| } |