1. 17 Jul, 2023 1 commit
    • Michael Goderbauer's avatar
      Stand-alone widget tree with multiple render trees to enable multi-view rendering (#125003) · 6f09064e
      Michael Goderbauer authored
      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")
      6f09064e
  2. 07 Mar, 2023 1 commit
  3. 20 Jan, 2023 1 commit
  4. 29 Aug, 2022 1 commit
  5. 16 Aug, 2022 1 commit
  6. 18 Jul, 2022 1 commit
  7. 25 May, 2022 1 commit
  8. 03 Feb, 2022 1 commit
  9. 13 Jan, 2022 1 commit
  10. 08 Jan, 2022 1 commit
  11. 14 Dec, 2021 1 commit
  12. 25 Jun, 2021 1 commit
  13. 21 May, 2021 1 commit
  14. 14 May, 2021 1 commit
  15. 13 May, 2021 1 commit
  16. 04 May, 2021 2 commits
  17. 26 Apr, 2021 1 commit
  18. 23 Apr, 2021 2 commits
  19. 06 Oct, 2020 1 commit
  20. 03 Oct, 2020 1 commit
  21. 17 Jun, 2020 1 commit
  22. 11 Jun, 2020 1 commit
  23. 31 May, 2020 1 commit
  24. 29 May, 2020 1 commit
    • liyuqian's avatar
      Add clipBehavior to widgets with clipRect (#55977) · cd593dae
      liyuqian authored
      * Add clipBehavior to RenderFlex
      
      * Add clipBehavior to FittedBox
      
      * Add clipBehavior to Flex and FittedBox
      
      * Add clipBehavior to UnconstrainedBox
      
      * Add clipBehavior to Stack and Wrap
      
      * Add clipBehavior to TextEditable
      
      * Add clipBehavior to ListWheelScrollView
      
      * Add clipBehavior to SingleChildScrollView
      
      * Add clipBehavior to RenderViewportBase's widgets
      
      Those widgets are NestedScrollView and ShrinkWrappingViewport.
      
      * Fix tests
      
      * Remove enum Overflow and fix typo
      
      * Remove clipToSize
      
      * Analyze fix
      
      * Remove Mixin and other small fixes
      
      * Fix tests and respect Stack's default clipBehavior
      
      * Add Overflow back to make it non-breaking
      
      * Restore clipBehavior to make it non-breaking
      
      * Small fixes
      
      * Fix rebase
      cd593dae
  25. 08 May, 2020 1 commit
  26. 08 Apr, 2020 1 commit
  27. 07 Jan, 2020 1 commit
  28. 27 Nov, 2019 1 commit
    • Ian Hickson's avatar
      License update (#45373) · 449f4a66
      Ian Hickson authored
      * 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
      449f4a66
  29. 26 Nov, 2019 1 commit
  30. 16 Aug, 2019 1 commit
    • Yegor's avatar
      Teach render objects to reuse engine layers (#36402) · 34c69265
      Yegor authored
      Teach Layer and its implementations, RenderObject and its implementations, and PaintingContext to reuse engine layers. The idea is that a concrete RenderObject creates a Layer and holds on to it as long as it needs it (i.e. when it is composited, and the layer type does not change). In return, each Layer object holds on to an EngineLayer and reports it to the engine via addRetained and oldLayer. This allows the Web engine to reuse DOM elements across frames. Without it, each frame drops all previously rendered HTML and regenerates it from scratch.
      34c69265
  31. 01 Mar, 2019 1 commit
    • Alexandre Ardhuin's avatar
      Add missing trailing commas (#28673) · 387f8854
      Alexandre Ardhuin authored
      * add trailing commas on list/map/parameters
      
      * add trailing commas on Invocation with nb of arg>1
      
      * add commas for widget containing widgets
      
      * add trailing commas if instantiation contains trailing comma
      
      * revert bad change
      387f8854
  32. 21 Feb, 2019 1 commit
  33. 12 Sep, 2018 1 commit
  34. 23 Aug, 2018 1 commit
  35. 05 Jun, 2018 1 commit
  36. 07 Dec, 2017 1 commit
    • Ian Hickson's avatar
      Move image logic from services/ to painting/. (#13409) · 44e228eb
      Ian Hickson authored
      This allows the scheduler library to depend on the services library
      and the painting library to depend on the scheduler library without
      the services library having to depend on the scheduler library.
      
      While I was at it I also cleaned up some of the binding logic: the
      licenses logic can now be overridden (and the test library does so),
      and the image cache can now be overridden as well.
      44e228eb
  37. 02 Oct, 2017 1 commit
    • Adam Barth's avatar
      Add Alignment, which will replace FractionalOffset (#12342) · 2b126bcd
      Adam Barth authored
      Unlike FractionalOffset, Alignment uses the center as the zero of the
      coordinate system, which makes the RTL math work out much cleaner.
      
      Also, make FractionalOffset into a subclass of Alignment so that clients
      can continue to use FractionalOffset.
      2b126bcd
  38. 05 May, 2017 1 commit