469 Commits

Author SHA1 Message Date
Greg Spencer
fe9a2c5477
Remove 'must not be null' comments from painting and rendering libraries. (#134993)
## Description

This removes all of the comments that are of the form "so-and-so (must not be null|can ?not be null|must be non-null)" from the cases where those values are defines as non-nullable values.

This PR removes them from the painting and rendering libraries.

This was done by hand, since it really didn't lend itself to scripting, so it needs to be more than just spot-checked, I think. I was careful to leave any comment that referred to parameters that were nullable, but I may have missed some.

In addition to being no longer relevant after null safety has been made the default, these comments were largely fragile, in that it was easy for them to get out of date, and not be accurate anymore anyhow.

This did create a number of constructor comments which basically say "Creates a [Foo].", but I don't really know how to avoid that in a large scale change, since there's not much you can really say in a lot of cases.  I think we might consider some leniency for constructors to the "Comment must be meaningful" style guidance (which we de facto have already, since there are a bunch of these).

## Related PRs
- https://github.com/flutter/flutter/pull/134984
- https://github.com/flutter/flutter/pull/134991
- https://github.com/flutter/flutter/pull/134992
- https://github.com/flutter/flutter/pull/134994

## Tests
 - Documentation only change.
2023-09-20 01:37:22 +00:00
LongCatIsLooong
dc8377b1d4
Ensure OverlayPortal.overlayChild's renderObject is reachable via treewalk (#134497)
Fixes https://github.com/flutter/flutter/issues/133545

` child._layoutSurrogate.markNeedsLayout();` was called when `_skipMarkNeedsLayout` is set true so when there's no relayout boundary between the layout surrogate and the RenderTheater, no dirty render objects will be added to the PipelineOwner's dirty list.

It's ok to mark the RenderTheater dirty when there's no layout boundary between it and the layout surrogate.
2023-09-12 22:41:45 +00:00
Ian Hickson
3a1300e0c4
Automatically create the layer when setting hints in PaintingContext (#130364)
Fixes https://github.com/flutter/flutter/issues/92722
2023-07-20 03:28:57 +00:00
Greg Price
f003911967
Fix contradictory advice in "detach" docs; cut redundancy in "attach" (#130688)
Fixes #115525.

On [AbstractNode.detach] and its two progeny [RenderNode.detach]
and [Layer.detach], the docs said both to call the inherited method
before detaching children, and to end by doing so.  The former
advice is what's enforced by an assertion in the base implementation,
so cut out the other.

The corresponding [attach] methods redundantly said twice to
call the inherited method first, so cut the redundancy.
Leave in place the version more recently added (in #76021), because
that PR shows the old version must have been easy to overlook.
2023-07-19 16:36:08 +00:00
Greg Price
1937ae6539
Make AbstractNode-derived docs more specific on RenderObject et al. (#130689)
These methods and/or their docs were recently copied (in #128467 and #128973) from their classes' former shared base class AbstractNode. Their wording was fittingly abstract there, but that abstraction is a bit puzzling for a reader finding them on these more concrete classes and not aware of the AbstractNode history.  So make them more concrete, in similar terms to the other methods around them.

Also copy some useful points between corresponding methods on different classes (like that the parent of the root is null), and try to clean up the prose on [RenderObject.depth].

We focus on the more outward-facing parts of the API, letting methods like `redepthChildren` continue to talk generically about "nodes".
2023-07-17 18:20:27 +00:00
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
d5c724eb07
Remove unused imports (#130603) 2023-07-14 13:36:02 -07:00
Yegor
07772a3d23
[framework,web] add FlutterTimeline and semantics benchmarks that use it (#128366)
## FlutterTimeline

Add a new class `FlutterTimeline` that's a drop-in replacement for `Timeline` from `dart:developer`. In addition to forwarding invocations of `startSync`, `finishSync`, `timeSync`, and `instantSync` to `dart:developer`, provides the following extra methods that make is easy to collect timings for code blocks on a frame-by-frame basis:

* `debugCollect()` - aggregates timings since the last reset, or since the app launched.
* `debugReset()` - forgets all data collected since the previous reset, or since the app launched. This allows clearing data from previous frames so timings can be attributed to the current frame.
* `now` - this was enhanced so that it works on the web by calling `window.performance.now` (in `Timeline` this is a noop in Dart web compilers).
* `collectionEnabled` - a field that controls whether `FlutterTimeline` stores timings in memory. By default this is disabled to avoid unexpected overhead (although the class is designed for minimal and predictable overhead). Specific benchmarks can enable collection to report to Skia Perf.

## Semantics benchmarks

Add `BenchMaterial3Semantics` that benchmarks the cost of semantics when constructing a screen full of Material 3 widgets from nothing. It is expected that semantics will have non-trivial cost in this case, but we should strive to keep it much lower than the rendering cost. This is the case already. This benchmark shows that the cost of semantics is <10%.

Add `BenchMaterial3ScrollSemantics` that benchmarks the cost of scrolling a previously constructed screen full of Material 3 widgets. The expectation should be that semantics will have trivial cost, since we're just shifting some widgets around. As of today, the numbers are not great, with semantics taking >50% of frame time, which is what prompted this PR in the first place. As we optimize this, we want to see this number improve.
2023-06-21 21:37:02 +00:00
Michael Goderbauer
5ab5d82a39
Remove AbstractNode from RenderObject and deprecate it (#128973)
It's time to say good bye to an old friend. 
It has outlived its usefulness.
Farewell, AbstractNode! 🫡
2023-06-16 16:16:36 +00:00
Ian Hickson
d64332a0aa
Improve the error message for non-normalized constraints (#127906)
We probably added RenderBox.layout after this error was created and of course we weren't writing tests back then...
2023-06-14 22:50:33 +00:00
chunhtai
9884b5f55e
Fixes IgnorePointer and AbsorbPointer to only block user interactions… (#120619)
Fixes IgnorePointer and AbsorbPointer to only block user interactions…
2023-04-07 15:51:05 +00:00
Ian Hickson
3fe5740153
Documentation improvements (#122787)
Documentation improvements
2023-03-22 18:58:57 +00:00
Michael Goderbauer
12ef7535a8
Reland "Introduce the PipelineOwner tree (#122231)" (#122452)
Reland "Introduce the PipelineOwner tree (#122231)"
2023-03-13 17:58:56 +00:00
Jim Graham
670f9d2037
Revert "Introduce the PipelineOwner tree (#122231)" (#122425)
This reverts commit f73c358e43df7c123e6d0141b3bc822877a1855d.
2023-03-10 13:15:46 -08:00
Michael Goderbauer
f73c358e43
Introduce the PipelineOwner tree (#122231)
Introduce the PipelineOwner tree
2023-03-10 19:57:17 +00:00
LongCatIsLooong
e7ab3b07f8
OverlayPortal (#105335)
`OverlayPortal`
2023-03-02 17:34:01 +00:00
chunhtai
978d9b5514
Issues/111931 reland (#121576)
* Revert "Revert "Fix text.rich to merge widget span (#113461)" (#121562)"

This reverts commit c8d80163b03f76e0cfde15567d065b6d1903cf8d.

* Fixes tag to not pollute cached semantics configuration in rendering object
2023-03-01 08:33:03 -08:00
chunhtai
c8d80163b0
Revert "Fix text.rich to merge widget span (#113461)" (#121562)
This reverts commit 660992a161ba04de706cd3931c32d3123e6e1228.
2023-02-27 15:38:43 -08:00
Michael Goderbauer
b1b7284a72
Move semantic-related bindings to SemanticsBinding (#121289)
Move semantic-related bindings to SemanticsBinding
2023-02-24 19:30:57 +00:00
Lioness100
26b6c1bedd
Fix typos (#121171)
* Fix typos

* lowercase animated & opacity

* Undo typo fix

---------

Co-authored-by: Michael Goderbauer <goderbauer@google.com>
2023-02-23 19:43:21 +00:00
chunhtai
660992a161
Fix text.rich to merge widget span (#113461)
* Fix text.rich to merge widget span

* migrate to new API

* update

* addressing comment

* addressing comments

* update

* addressing comment

* Update
2023-02-23 17:38:52 +00:00
Michael Goderbauer
9837eb6fc5
Remove unnecessary null checks in flutter/rendering (#118923) 2023-01-21 01:34:50 +00:00
LongCatIsLooong
3d0607b543
Defer systemFontsDidChange to the transientCallbacks phase (#117123)
* Always defer systemFontsDidChange to transientCallbacks phase

* unnecessary import
2022-12-16 19:27:03 +00:00
chunhtai
23a2fa31d2
Reland "Adds API in semanticsconfiguration to decide how to merge chi… (#116895)
* Reland "Adds API in semanticsconfiguration to decide how to merge child semanticsConfigurations (#110730)"

This reverts commit 7549925c8c44dea92c7bc75be676c17b7613f87f.

* makes markNeedsSemanticsUpdate more robust

* address comment
2022-12-16 17:20:20 +00:00
Casey Hillers
7549925c8c
Revert "Adds API in semanticsconfiguration to decide how to merge child semanticsConfigurations (#110730)" (#116839)
This reverts commit 352ad3a9efccc8c54deb72eb0d7164bfb42b2a49.
2022-12-11 02:23:40 +00:00
chunhtai
352ad3a9ef
Adds API in semanticsconfiguration to decide how to merge child semanticsConfigurations (#110730)
* Adds semantics merger API and fix input decorator

* addressing comments

* abstractnode to object

* feature complete

* addressing comments

* fix comments

* conditionally add sort order

* fix bool

* fix test

* more fix

* fix tests
2022-12-07 16:59:16 +00:00
fzyzcjy
7d2b01132d
Fix logic error in markNeedsPaint (#112735)
* Update object.dart

* Update object.dart

* Update object.dart

* Update object.dart

* Update object.dart
2022-11-16 00:06:51 +00:00
fzyzcjy
e37ab48bca
Introduce debugWithActiveLayoutCleared to avoid duplicated code (#114003) 2022-11-01 22:17:11 +00:00
fzyzcjy
c8fc2858de
Fix incorrectly named "debug" prefix (#114117) 2022-10-31 15:39:52 +00:00
Alex Wallen
23d258df57
Remove deprecated updateSemantics API usage. (#113382) 2022-10-26 20:20:41 +00:00
Polina Cherkasova
0a35cf95eb
Instrument State, Layer, RenderObject and Element. (#111328) 2022-09-20 16:39:46 -07:00
Dan Field
36a5a0f55f
Avoid sending zero transform semantic nodes to the engine (#111843) 2022-09-19 20:11:47 +00:00
Alexandre Ardhuin
ccd33631e3
enable combinators_ordering (#107847) 2022-07-18 22:04:07 +00:00
LongCatIsLooong
09a5382ff9
Add error messages to _debugCanPerformMutations (#105638) 2022-07-02 00:55:04 +00:00
Alexandre Ardhuin
0f6244fa42
Export public API types from gestures/*.dart library (#105864) 2022-06-17 20:42:05 +00:00
LongCatIsLooong
d3785152c4
Merge dirty relayout boundaries after RenderObject.invokeLayoutCallback (#105175) 2022-06-02 18:28:10 -07:00
Justin McCandless
91836d6a62
its => it (#104730)
Just a small grammar fix in the PipelineOwner docs.
2022-05-26 12:59:03 -07:00
Pierre-Louis
e71eb183d8
Use curly_braces_in_flow_control_structures for rendering (#104611)
* Use `curly_braces_in_flow_control_structures` for `rendering`

* fix comments

* fix dangling
2022-05-25 19:57:57 +02:00
chunhtai
efb9368573
Supports global selection for all devices (#95226)
* Support global selection

* addressing comments

* add new test

* Addressing review comments

* update

* addressing comments

* addressing comments

* Addressing comments

* fix build
2022-05-24 13:53:55 -07:00
LongCatIsLooong
12147ad718
Remove RenderObject.rotate (#103092) 2022-05-24 11:37:35 -07:00
Casey Hillers
da105b2b24
Revert "[framework] inline AbstractNode into RenderObject" (#104257) 2022-05-20 11:43:11 -07:00
Jonah Williams
24bd28f696
[framework] inline AbstractNode into RenderObject (#103832) 2022-05-19 14:28:09 -07:00
Dan Field
1662a14bc8
More missing clipBehavior respects (#103931) 2022-05-17 11:32:11 -07:00
Dan Field
d54cdf9e18
Add a mechanism to observe layer tree composition. (#103378) 2022-05-17 11:22:11 -07:00
Dan Field
fe87538b76
Implement paintsChild on RenderObjects that skip painting on their children (#103768) 2022-05-16 11:29:07 -07:00
Jonah Williams
b05b44e88a
remove assert on markNeedsCompositingBitsUpdate (#103227) 2022-05-06 23:39:08 -07:00
Jonah Williams
fba9214d11
[framework] remove usage and deprecate physical model layer (#102274) 2022-04-26 16:14:04 -07:00
Jonah Williams
0cb5772e73
[framework] allow other RenderObjects to behave like repaint boundaries (#101952) 2022-04-26 10:19:09 -07:00
Michael Goderbauer
51bcdb9407
super parameters for framework (#100905) 2022-04-13 22:38:40 -07:00
gaaclarke
9124287060
removed obsolete timelineArgumentsIndicatingLandmarkEvent (#101382) 2022-04-12 17:04:08 -07:00