mirror of
https://github.com/flutter/flutter.git
synced 2025-06-03 00:51:18 +00:00
Fixes listview shrinkwrap and hidden semantics node gets updated incorrectly. (#88814)
This commit is contained in:
parent
38186c8971
commit
0e9665e4ef
@ -5056,7 +5056,6 @@ class RenderIndexedSemantics extends RenderProxyBox {
|
||||
@override
|
||||
void describeSemanticsConfiguration(SemanticsConfiguration config) {
|
||||
super.describeSemanticsConfiguration(config);
|
||||
config.isSemanticBoundary = true;
|
||||
config.indexInParent = index;
|
||||
}
|
||||
|
||||
|
@ -1920,6 +1920,14 @@ class RenderShrinkWrappingViewport extends RenderViewportBase<SliverLogicalConta
|
||||
_maxScrollExtent = 0.0;
|
||||
_shrinkWrapExtent = 0.0;
|
||||
_hasVisualOverflow = false;
|
||||
switch (cacheExtentStyle) {
|
||||
case CacheExtentStyle.pixel:
|
||||
_calculatedCacheExtent = cacheExtent;
|
||||
break;
|
||||
case CacheExtentStyle.viewport:
|
||||
_calculatedCacheExtent = mainAxisExtent * _cacheExtent;
|
||||
break;
|
||||
}
|
||||
return layoutChildSequence(
|
||||
child: firstChild,
|
||||
scrollOffset: math.max(0.0, correctedOffset),
|
||||
@ -1930,8 +1938,8 @@ class RenderShrinkWrappingViewport extends RenderViewportBase<SliverLogicalConta
|
||||
crossAxisExtent: crossAxisExtent,
|
||||
growthDirection: GrowthDirection.forward,
|
||||
advance: childAfter,
|
||||
remainingCacheExtent: mainAxisExtent + 2 * _cacheExtent,
|
||||
cacheOrigin: -_cacheExtent,
|
||||
remainingCacheExtent: mainAxisExtent + 2 * _calculatedCacheExtent!,
|
||||
cacheOrigin: -_calculatedCacheExtent!,
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -310,6 +310,65 @@ void main() {
|
||||
expect(find.text('19'), findsOneWidget);
|
||||
});
|
||||
|
||||
testWidgets('ListView with shrink wrap in bounded context correctly uses cache extent', (WidgetTester tester) async {
|
||||
final SemanticsHandle handle = tester.ensureSemantics();
|
||||
await tester.pumpWidget(
|
||||
Directionality(
|
||||
textDirection: TextDirection.ltr,
|
||||
child: SizedBox(
|
||||
height: 400,
|
||||
child: ListView(
|
||||
itemExtent: 100.0,
|
||||
shrinkWrap: true,
|
||||
children: List<Widget>.generate(20, (int i) {
|
||||
return Text('Text $i');
|
||||
}),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
expect(tester.getSemantics(find.text('Text 5')), matchesSemantics(isHidden: false));
|
||||
expect(tester.getSemantics(find.text('Text 6', skipOffstage: false)), matchesSemantics(isHidden: true));
|
||||
expect(tester.getSemantics(find.text('Text 7', skipOffstage: false)), matchesSemantics(isHidden: true));
|
||||
expect(tester.getSemantics(find.text('Text 8', skipOffstage: false)), matchesSemantics(isHidden: true));
|
||||
handle.dispose();
|
||||
});
|
||||
|
||||
testWidgets('ListView hidden items should stay hidden if their semantics are updated', (WidgetTester tester) async {
|
||||
final SemanticsHandle handle = tester.ensureSemantics();
|
||||
await tester.pumpWidget(
|
||||
Directionality(
|
||||
textDirection: TextDirection.ltr,
|
||||
child: SizedBox(
|
||||
height: 400,
|
||||
child: ListView(
|
||||
itemExtent: 100.0,
|
||||
shrinkWrap: true,
|
||||
children: List<Widget>.generate(20, (int i) {
|
||||
return Text('Text $i');
|
||||
}),
|
||||
),
|
||||
),
|
||||
),
|
||||
);
|
||||
// Scrollable maybe be marked dirty after layout.
|
||||
await tester.pumpAndSettle();
|
||||
expect(tester.getSemantics(find.text('Text 5')), matchesSemantics(isHidden: false));
|
||||
expect(tester.getSemantics(find.text('Text 6', skipOffstage: false)), matchesSemantics(isHidden: true));
|
||||
expect(tester.getSemantics(find.text('Text 7', skipOffstage: false)), matchesSemantics(isHidden: true));
|
||||
expect(tester.getSemantics(find.text('Text 8', skipOffstage: false)), matchesSemantics(isHidden: true));
|
||||
|
||||
// Marks Text 6 semantics as dirty.
|
||||
final RenderObject text6 = tester.renderObject(find.text('Text 6', skipOffstage: false));
|
||||
text6.markNeedsSemanticsUpdate();
|
||||
|
||||
// Verify the semantics is still hidden.
|
||||
await tester.pump();
|
||||
expect(tester.getSemantics(find.text('Text 6', skipOffstage: false)), matchesSemantics(isHidden: true));
|
||||
|
||||
handle.dispose();
|
||||
});
|
||||
|
||||
testWidgets('didFinishLayout has correct indices', (WidgetTester tester) async {
|
||||
final TestSliverChildListDelegate delegate = TestSliverChildListDelegate(
|
||||
List<Widget>.generate(
|
||||
|
Loading…
Reference in New Issue
Block a user