• Victoria Ashworth's avatar
    Set cacheExtent for SliverFillRemaining widget (#143612) · 825e901e
    Victoria Ashworth authored
    When a Sliver with items is outside of the Viewport, but within the Viewport's `cacheExtent`, the framework should create SemanticNodes for the items even though they are out of view. However, for this to work, the Sliver's geometry must have a `cacheExtent` (how much space the sliver took up of the Viewport's `cacheExtent`) greater than 0, otherwise it is [excluded](https://github.com/flutter/flutter/blob/f01ce9f4cb41beff7b85122b5fcf1228bb655a87/packages/flutter/lib/src/rendering/viewport.dart#L311-L315).
    
    `SliverFillRemaining` widgets that fall outside the viewport did not have this set and therefore were being excluded when SemanticNodes were created, even if they were within the Viewport's `cacheExtent`. This PR sets the `cacheExtent` for `SliverFillRemaining` widgets.
    
    In addition, `RenderSliverFillRemainingWithScrollable` would get dropped from the semantic tree because it's child had a size of 0 when outside the remaining paint extent. To fix, we give the child a `maxExtent` of the sliver's `cacheExtent` if it's outside the remaining paint extent but within the viewport's cacheExtent.
    
    Fixes https://github.com/flutter/flutter/issues/142065.
    
    Definitions:
    * `RenderViewport.cacheExtent`:
      ```dart
      /// The viewport has an area before and after the visible area to cache items
      /// that are about to become visible when the user scrolls.
      ///
      /// Items that fall in this cache area are laid out even though they are not
      /// (yet) visible on screen. The [cacheExtent] describes how many pixels
      /// the cache area extends before the leading edge and after the trailing edge
      /// of the viewport.
      ///
      /// The total extent, which the viewport will try to cover with children, is
      /// [cacheExtent] before the leading edge + extent of the main axis +
      /// [cacheExtent] after the trailing edge.
      ///
      /// The cache area is also used to implement implicit accessibility scrolling
      /// on iOS: When the accessibility focus moves from an item in the visible
      /// viewport to an invisible item in the cache area, the framework will bring
      /// that item into view with an (implicit) scroll action.
      ```
    * `SliverGeometry.cacheExtent`:
      ```dart
      /// How many pixels the sliver has consumed in the
      /// [SliverConstraints.remainingCacheExtent].
      ```
    * `SliverContraints.remainingCacheExtent`:
      ```dart
      /// Describes how much content the sliver should provide starting from the
      /// [cacheOrigin].
      ///
      /// Not all content in the [remainingCacheExtent] will be visible as some
      /// of it might fall into the cache area of the viewport.
      ///
      /// Each sliver should start laying out content at the [cacheOrigin] and
      /// try to provide as much content as the [remainingCacheExtent] allows.
      ```
    825e901e
Name
Last commit
Last update
.github Loading commit data...
.vscode Loading commit data...
bin Loading commit data...
dev Loading commit data...
examples Loading commit data...
packages Loading commit data...
.ci.yaml Loading commit data...
.gitattributes Loading commit data...
.gitignore Loading commit data...
AUTHORS Loading commit data...
CODEOWNERS Loading commit data...
CODE_OF_CONDUCT.md Loading commit data...
CONTRIBUTING.md Loading commit data...
LICENSE Loading commit data...
PATENT_GRANT Loading commit data...
README.md Loading commit data...
TESTOWNERS Loading commit data...
analysis_options.yaml Loading commit data...
dartdoc_options.yaml Loading commit data...
flutter_console.bat Loading commit data...