From 36a8f0f2ae01701a451846e5696a64678b0c8011 Mon Sep 17 00:00:00 2001 From: Marcel Kirchhoff Date: Tue, 8 Feb 2022 01:15:19 +0100 Subject: [PATCH] RenderIndexedStack - Mark invisible children as offstage in debugDescribeProperties (#96639) --- packages/flutter/lib/src/rendering/stack.dart | 16 +++++++++++ .../flutter/test/rendering/stack_test.dart | 28 +++++++++++++++++++ 2 files changed, 44 insertions(+) diff --git a/packages/flutter/lib/src/rendering/stack.dart b/packages/flutter/lib/src/rendering/stack.dart index d89272df63..9f8955d709 100644 --- a/packages/flutter/lib/src/rendering/stack.dart +++ b/packages/flutter/lib/src/rendering/stack.dart @@ -749,4 +749,20 @@ class RenderIndexedStack extends RenderStack { super.debugFillProperties(properties); properties.add(IntProperty('index', index)); } + + @override + List debugDescribeChildren() { + final List children = []; + int i = 0; + RenderObject? child = firstChild; + while (child != null) { + children.add(child.toDiagnosticsNode( + name: 'child ${i + 1}', + style: i != index! ? DiagnosticsTreeStyle.offstage : null, + )); + child = (child.parentData! as StackParentData).nextSibling; + i += 1; + } + return children; + } } diff --git a/packages/flutter/test/rendering/stack_test.dart b/packages/flutter/test/rendering/stack_test.dart index ef4432035f..a89a47434c 100644 --- a/packages/flutter/test/rendering/stack_test.dart +++ b/packages/flutter/test/rendering/stack_test.dart @@ -2,6 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import 'package:flutter/foundation.dart'; import 'package:flutter/rendering.dart'; import 'package:flutter_test/flutter_test.dart'; @@ -118,6 +119,33 @@ void main() { expect(visitedChildren.first, child2); }); + test('debugDescribeChildren marks invisible children as offstage', () { + final RenderBox child1 = RenderConstrainedBox( + additionalConstraints: BoxConstraints.tight(const Size(100.0, 100.0)), + ); + final RenderBox child2 = RenderConstrainedBox( + additionalConstraints: BoxConstraints.tight(const Size(100.0, 100.0)), + ); + final RenderBox child3 = RenderConstrainedBox( + additionalConstraints: BoxConstraints.tight(const Size(100.0, 100.0)), + ); + + final RenderBox stack = RenderIndexedStack( + index: 2, + children: [child1, child2, child3], + ); + + final List diagnosticNodes = stack.debugDescribeChildren(); + + expect(diagnosticNodes[0].name, 'child 1'); + expect(diagnosticNodes[0].style, DiagnosticsTreeStyle.offstage); + + expect(diagnosticNodes[1].name, 'child 2'); + expect(diagnosticNodes[1].style, DiagnosticsTreeStyle.offstage); + + expect(diagnosticNodes[2].name, 'child 3'); + expect(diagnosticNodes[2].style, DiagnosticsTreeStyle.sparse); + }); }); // More tests in ../widgets/stack_test.dart