32 Commits

Author SHA1 Message Date
Michael Goderbauer
6f09064e78
Stand-alone widget tree with multiple render trees to enable multi-view rendering (#125003)
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](https://flutter.dev/go/multiple-views). Below is a high-level summary organized by layers.

### Rendering layer changes

* The `RendererBinding` no longer owns a single `renderView`. In fact, it doesn't OWN any `RenderView`s at all anymore. Instead, it offers an API (`addRenderView`/`removeRenderView`) to add and remove `RenderView`s that then will be MANAGED by the binding. The `RenderView` itself is now owned by a higher-level abstraction (e.g. the `RawView` Element of the widgets layer, see below), who is also in charge of adding it to the binding. When added, the binding will interact with the `RenderView` to produce a frame (e.g. by calling `compositeFrame` on it) and to perform hit tests for incoming pointer events. Multiple `RenderView`s can be added to the binding (typically one per `FlutterView`) to produce multiple Scenes.
* Instead of owning a single `pipelineOwner`, the `RendererBinding` now owns the root of the `PipelineOwner` tree (exposed as `rootPipelineOwner` on the binding). Each `PipelineOwner` in that tree (except for the root) typically manages its own render tree typically rooted in one of the `RenderView`s mentioned in the previous bullet. During frame production, the binding will instruct each `PipelineOwner` of that tree to flush layout, paint, semantics etc. A higher-level abstraction (e.g. the widgets layer, see below) is in charge of adding `PipelineOwner`s to this tree.
* Backwards compatibility: The old `renderView` and `pipelineOwner` properties of the `RendererBinding` are retained, but marked as deprecated. Care has been taken to keep their original behavior for the deprecation period, i.e. if you just call `runApp`, the render tree bootstrapped by this call is rooted in the deprecated `RendererBinding.renderView` and managed by the deprecated `RendererBinding.pipelineOwner`.

### Widgets layer changes

* The `WidgetsBinding` no 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, `RenderObjectToWidgetAdapter` has been replaced by `RootWidget`.
* Multiple render trees can be bootstrapped and attached to the widget tree with the help of the `View` widget, which internally is backed by a `RawView` widget. Configured with a `FlutterView` to render into, the `RawView` creates a new `PipelineOwner` and a new `RenderView` for the new render tree. It adds the new `RenderView` to the `RendererBinding` and its `PipelineOwner` to the pipeline owner tree.
* The `View` widget can only appear in certain well-defined locations in the widget tree since it bootstraps a new render tree and does not insert a `RenderObject` into an ancestor. However, almost all Elements expect that their children insert `RenderObject`s, otherwise they will not function properly. To produce a good error message when the `View` widget is used in an illegal location, the `debugMustInsertRenderObjectIntoSlot` method 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, the `View` widget can be used as a child of the `RootWidget`, inside the `view` slot of the `ViewAnchor` (see below) and inside a `ViewCollection` (see below). In those locations, the `View` widget may be wrapped in other non-RenderObjectWidgets (e.g. InheritedWidgets).
* The new `ViewAnchor` can be used to create a side-view inside a parent `View`. The `child` of the `ViewAnchor` widget renders into the parent `View` as usual, but the `view` slot can take on another `View` widget, which has access to all inherited widgets above the `ViewAnchor`. Metaphorically speaking, the view is anchored to the location of the `ViewAnchor` in the widget tree.
* The new `ViewCollection` widget allows for multiple sibling views as it takes a list of `View`s as children. It can be used in all the places that accept a `View` widget.

## 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/flutter` first. The majority of the changes describe above are implemented in (listed in suggested review order):

* `rendering/binding.dart`
* `widgets/binding.dart`
* `widgets/view.dart`
* `widgets/framework.dart`

All 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")
2023-07-17 16:14:08 +00:00
Michael Goderbauer
a599c08c32
Remvoe last few references to window singleton (#122644)
Remove last few references to window singleton
2023-03-15 00:34:34 +00:00
fzyzcjy
4ead92cf9b
Fix UiKitView which wrongly unconditionally repaints (#111790) 2022-09-19 17:16:18 +00:00
Dan Field
0cc7db54ce
Guard against usage after async callbacks in RenderAndroidView, unregister listener (#108496) 2022-07-28 18:36:04 +00:00
Emmanuel Garcia
032205eaca
Reland: "Use texture layer when displaying an Android view" (#100990) 2022-03-29 19:40:17 -07:00
Zachary Anderson
37d619d228
Revert "Reland: "Use texture layer when displaying an Android view" (#100934)" (#100950)
This reverts commit 61c30eed4f19009aa3caf8eede877c40c105b1b9.
2022-03-29 08:27:55 -07:00
Emmanuel Garcia
61c30eed4f
Reland: "Use texture layer when displaying an Android view" (#100934) 2022-03-28 21:25:06 -07:00
Emmanuel Garcia
19680c34cc
Revert "Reland: "Always use texture layer when displaying an Android view" (#100237)" (#100660)
This reverts commit d92fedcccb645ba155e93c5b72052692f10196b1.
2022-03-24 00:28:13 -07:00
Emmanuel Garcia
d92fedcccb
Reland: "Always use texture layer when displaying an Android view" (#100237) 2022-03-17 12:46:26 -07:00
Zachary Anderson
1c2c942112
Revert "Always use texture layer when displaying an Android view (#100091)" (#100222)
This reverts commit 509ddfda5c1bda7c01cf51fe24607da19423d5f9.
2022-03-16 09:12:25 -07:00
Emmanuel Garcia
509ddfda5c
Always use texture layer when displaying an Android view (#100091) 2022-03-15 21:10:18 -07:00
Michael Goderbauer
7f2c1cd772
Use PlatformDispatcher.instance over window where possible (#99496) 2022-03-03 14:46:16 -08:00
Emmanuel Garcia
f4fc2c87f7
Test that render object changed its visual appearance after texture is create (#98622) 2022-02-22 14:53:17 -08:00
Ian Hickson
ab89ce285f
Clean up the bindings APIs. (#89451) 2022-02-03 14:55:15 -08:00
Darren Austin
225a43d941
Updated skipped tests for rendering directory. (#87700) 2021-08-05 11:32:48 -07:00
Ahmed Ashour
a3dc90c4f5
Add space before curly parentheses. (#85306) 2021-07-01 13:51:05 -07:00
xubaolin
0347c533f1
fix a PlatformView gesture bug (#84257) 2021-06-10 17:39:03 -07:00
Alexandre Ardhuin
59fc92168a
add missing trailing commas (#81065) 2021-04-23 22:47:40 +02:00
Sam Rawlins
dea1c46a3c
Remove "unnecessary" imports. (#75637) 2021-02-10 17:06:03 -08:00
Alexandre Ardhuin
d546e1d311
fix for upcoming lint use_named_constants (#74788) 2021-01-27 20:20:44 +01:00
Kate Lovett
019e90f7df
[NNBD] Migrates some rendering tests (#67449) 2020-10-07 16:27:06 -07:00
Tong Mu
2cdf2f0059
Treat hover events as normal pointer events, and bring them back to Listener (#63834) 2020-10-05 12:12:04 -07:00
Tong Mu
fb0b982324
Change MouseTracker's interface for clarity. Simplify MouseRegion's implementation. (#64119)
* Redesigns the interface between MouseTracker and RendererBinding&RenderView.
* Simplifies the structure of RenderMouseRegion.
* Extracts the common utility code between mouse_tracker_test and mouse_tracker_cursor_test.
2020-08-19 18:51:56 -07:00
Tong Mu
5398f5c566
Add tests for platform views' hover behavior (#61667) 2020-07-29 14:47:06 -07:00
Alexandre Ardhuin
4d7525f05c
Opt out nnbd in packages/flutter (#59186)
* add language version 2.8 in packages/flutter

* enable non-nullable analyzer flag
2020-06-11 14:11:30 +02:00
Alexandre Ardhuin
dfbd585668 implicit-casts:false in flutter/test (#46245) 2019-12-16 15:03:02 -08:00
Chris Bracken
fa0c49d775
Dispatch hover events to PlatformViewController (#46124)
This adds support to PlatformViewLayer for handling hover events. Prior
to this, PlatformViewLayers only supported events forwarded by the
gesture recognizers associated with the PlatformViewRenderBox. Hover
events don't participate in gesture recognition and as such are dropped
in GestureBinding. That said, hover event processing in platform views
is expected for desktop and other platforms with hover event support.

This adds support for passing an optional MouseTrackerAnnotation to
PlatformViewLayer. PlatformViewRenderBox populates this with a mouse
tracker annotation that forwards hover events to
PlatformViewController.dispatchPointerEvent() for handling by users.
2019-12-05 13:31:50 -08:00
Ian Hickson
449f4a6673
License update (#45373)
* Update project.pbxproj files to say Flutter rather than Chromium

Also, the templates now have an empty organization so that we don't cause people to give their apps a Flutter copyright.

* Update the copyright notice checker to require a standard notice on all files

* Update copyrights on Dart files. (This was a mechanical commit.)

* Fix weird license headers on Dart files that deviate from our conventions; relicense Shrine.

Some were already marked "The Flutter Authors", not clear why. Their
dates have been normalized. Some were missing the blank line after the
license. Some were randomly different in trivial ways for no apparent
reason (e.g. missing the trailing period).

* Clean up the copyrights in non-Dart files. (Manual edits.)

Also, make sure templates don't have copyrights.

* Fix some more ORGANIZATIONNAMEs
2019-11-27 15:04:02 -08:00
Yegor
21a18fbe16
enable rendering rests on the Web (#42773) 2019-10-15 15:25:47 -07:00
Alexandre Ardhuin
f11c34109c
fix bad indentations(mainly around collection literals) (#41355) 2019-09-27 10:46:45 +02:00
Chris Yang
333c961884
Extract common PlatformView functionality: Gesture and PointerEvent (#37497) 2019-08-06 09:05:29 -07:00
Chris Yang
9553f8daa7
Extract common PlatformView functionality: Painting and Semantics (#36955)
* painting and semantics

* more comments

* fixing ci

* review fixes

* add assert for id

* rename custom layer factory to layer builder

* review updates

* partial review fixes

* some doc updates

* more doc updates

* only expose getter for id in PlatformViewController

* doc updates/removing all the  references

* remove extra

* more doc updates

* some doc updates

* more doc fixes

* review fixes
2019-08-02 10:07:59 -07:00