diff --git a/packages/flutter/lib/src/rendering/proxy_box.dart b/packages/flutter/lib/src/rendering/proxy_box.dart index e71f10bbbf3..8c39deae414 100644 --- a/packages/flutter/lib/src/rendering/proxy_box.dart +++ b/packages/flutter/lib/src/rendering/proxy_box.dart @@ -5056,7 +5056,6 @@ class RenderIndexedSemantics extends RenderProxyBox { @override void describeSemanticsConfiguration(SemanticsConfiguration config) { super.describeSemanticsConfiguration(config); - config.isSemanticBoundary = true; config.indexInParent = index; } diff --git a/packages/flutter/lib/src/rendering/viewport.dart b/packages/flutter/lib/src/rendering/viewport.dart index da9aeb739f6..3e32b4a2642 100644 --- a/packages/flutter/lib/src/rendering/viewport.dart +++ b/packages/flutter/lib/src/rendering/viewport.dart @@ -1920,6 +1920,14 @@ class RenderShrinkWrappingViewport extends RenderViewportBase.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.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.generate(