Stand-alone widget tree with multiple render trees to enable multi-view rendering#125003
Merged
auto-submit[bot] merged 115 commits intoflutter:masterfrom Jul 17, 2023
Merged
Stand-alone widget tree with multiple render trees to enable multi-view rendering#125003auto-submit[bot] merged 115 commits intoflutter:masterfrom
auto-submit[bot] merged 115 commits intoflutter:masterfrom
Conversation
b53331d to
b4f9996
Compare
8993887 to
c6dd65f
Compare
478a36b to
43a9a19
Compare
9b1458e to
7c92446
Compare
Closed
This was referenced Jul 17, 2023
4 tasks
2 tasks
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Part of #121573.
This change enables Flutter to generate multiple Scenes to be rendered into separate FlutterViews from a single widget tree. Each Scene is described by a separate render tree, which are all associated with the single widget tree.
This PR implements the framework-side mechanisms to describe the content to be rendered into multiple views. Separate engine-side changes are necessary to provide these views to the framework and to draw the framework-generated Scene into them.
Summary of changes
The details of this change are described in flutter.dev/go/multiple-views. Below is a high-level summary organized by layers.
Rendering layer changes
RendererBindingno longer owns a singlerenderView. In fact, it doesn't OWN anyRenderViews at all anymore. Instead, it offers an API (addRenderView/removeRenderView) to add and removeRenderViews that then will be MANAGED by the binding. TheRenderViewitself is now owned by a higher-level abstraction (e.g. theRawViewElement of the widgets layer, see below), who is also in charge of adding it to the binding. When added, the binding will interact with theRenderViewto produce a frame (e.g. by callingcompositeFrameon it) and to perform hit tests for incoming pointer events. MultipleRenderViews can be added to the binding (typically one perFlutterView) to produce multiple Scenes.pipelineOwner, theRendererBindingnow owns the root of thePipelineOwnertree (exposed asrootPipelineOwneron the binding). EachPipelineOwnerin that tree (except for the root) typically manages its own render tree typically rooted in one of theRenderViews mentioned in the previous bullet. During frame production, the binding will instruct eachPipelineOwnerof that tree to flush layout, paint, semantics etc. A higher-level abstraction (e.g. the widgets layer, see below) is in charge of addingPipelineOwners to this tree.renderViewandpipelineOwnerproperties of theRendererBindingare retained, but marked as deprecated. Care has been taken to keep their original behavior for the deprecation period, i.e. if you just callrunApp, the render tree bootstrapped by this call is rooted in the deprecatedRendererBinding.renderViewand managed by the deprecatedRendererBinding.pipelineOwner.Widgets layer changes
WidgetsBindingno longer attaches the widget tree to an existing render tree. Instead, it bootstraps a stand-alone widget tree that is not backed by a render tree. For this,RenderObjectToWidgetAdapterhas been replaced byRootWidget.Viewwidget, which internally is backed by aRawViewwidget. Configured with aFlutterViewto render into, theRawViewcreates a newPipelineOwnerand a newRenderViewfor the new render tree. It adds the newRenderViewto theRendererBindingand itsPipelineOwnerto the pipeline owner tree.Viewwidget can only appear in certain well-defined locations in the widget tree since it bootstraps a new render tree and does not insert aRenderObjectinto an ancestor. However, almost all Elements expect that their children insertRenderObjects, otherwise they will not function properly. To produce a good error message when theViewwidget is used in an illegal location, thedebugMustInsertRenderObjectIntoSlotmethod has been added to Element, where a child can ask whether a given slot must insert a RenderObject into its ancestor or not. In practice, theViewwidget can be used as a child of theRootWidget, inside theviewslot of theViewAnchor(see below) and inside aViewCollection(see below). In those locations, theViewwidget may be wrapped in other non-RenderObjectWidgets (e.g. InheritedWidgets).ViewAnchorcan be used to create a side-view inside a parentView. Thechildof theViewAnchorwidget renders into the parentViewas usual, but theviewslot can take on anotherViewwidget, which has access to all inherited widgets above theViewAnchor. Metaphorically speaking, the view is anchored to the location of theViewAnchorin the widget tree.ViewCollectionwidget allows for multiple sibling views as it takes a list ofViews as children. It can be used in all the places that accept aViewwidget.Google3
As of July 5, 2023 this change passed a TAP global presubmit (TGP) in google3: tap/OCL:544707016:BASE:545809771:1688597935864:e43dd651
Note to reviewers
This change is big (sorry). I suggest focusing the initial review on the changes inside of
packages/flutterfirst. The majority of the changes describe above are implemented in (listed in suggested review order):rendering/binding.dartwidgets/binding.dartwidgets/view.dartwidgets/framework.dartAll other changes included in the PR are basically the fallout of what's implemented in those files. Also note that a lot of the lines added in this PR are documentation and tests.
I am also very happy to walk reviewers through the code in person or via video call, if that is helpful.
I appreciate any feedback.
Feedback to address before submitting ("TODO")
DiagnosticableTree