From 0e9665e4ef59fca7d5c2eeed178cdd98d4a09fa0 Mon Sep 17 00:00:00 2001 From: chunhtai <47866232+chunhtai@users.noreply.github.com> Date: Tue, 24 Aug 2021 18:09:04 -0700 Subject: [PATCH] Fixes listview shrinkwrap and hidden semantics node gets updated incorrectly. (#88814) --- .../flutter/lib/src/rendering/proxy_box.dart | 1 - .../flutter/lib/src/rendering/viewport.dart | 12 +++- .../flutter/test/widgets/list_view_test.dart | 59 +++++++++++++++++++ 3 files changed, 69 insertions(+), 3 deletions(-) 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(