From d9789851b9cc488a7704db06c8022155324ec9ba Mon Sep 17 00:00:00 2001 From: xubaolin Date: Thu, 7 Apr 2022 17:25:27 +0800 Subject: [PATCH 1/6] ++ --- packages/flutter/lib/src/rendering/box.dart | 23 +++++++--- .../rendering/cached_intrinsics_test.dart | 46 +++++++++++++++++++ 2 files changed, 63 insertions(+), 6 deletions(-) diff --git a/packages/flutter/lib/src/rendering/box.dart b/packages/flutter/lib/src/rendering/box.dart index bef7ca101df8d..3cc89c0fa15ff 100644 --- a/packages/flutter/lib/src/rendering/box.dart +++ b/packages/flutter/lib/src/rendering/box.dart @@ -2348,8 +2348,7 @@ abstract class RenderBox extends RenderObject { }()); } - @override - void markNeedsLayout() { + bool _clearCachedData() { if ((_cachedBaselines != null && _cachedBaselines!.isNotEmpty) || (_cachedIntrinsicDimensions != null && _cachedIntrinsicDimensions!.isNotEmpty) || (_cachedDryLayoutSizes != null && _cachedDryLayoutSizes!.isNotEmpty)) { @@ -2361,14 +2360,26 @@ abstract class RenderBox extends RenderObject { _cachedBaselines?.clear(); _cachedIntrinsicDimensions?.clear(); _cachedDryLayoutSizes?.clear(); - if (parent is RenderObject) { - markParentNeedsLayout(); - return; - } + return true; + } + return false; + } + + @override + void markNeedsLayout() { + if (_clearCachedData() && parent is RenderObject) { + markParentNeedsLayout(); + return; } super.markNeedsLayout(); } + @override + void layout(Constraints constraints, {bool parentUsesSize = false}) { + _clearCachedData(); + super.layout(constraints, parentUsesSize: parentUsesSize); + } + /// {@macro flutter.rendering.RenderObject.performResize} /// /// By default this method sets [size] to the result of [computeDryLayout] diff --git a/packages/flutter/test/rendering/cached_intrinsics_test.dart b/packages/flutter/test/rendering/cached_intrinsics_test.dart index 29456942161f3..2e2be1a61a83f 100644 --- a/packages/flutter/test/rendering/cached_intrinsics_test.dart +++ b/packages/flutter/test/rendering/cached_intrinsics_test.dart @@ -5,7 +5,10 @@ import 'package:flutter/rendering.dart'; import 'package:flutter_test/flutter_test.dart'; +import 'rendering_tester.dart'; + class RenderTestBox extends RenderBox { + late Size boxSize; double value = 0.0; double next() { value += 1.0; @@ -19,9 +22,22 @@ class RenderTestBox extends RenderBox { double computeMinIntrinsicHeight(double width) => next(); @override double computeMaxIntrinsicHeight(double width) => next(); + + @override + void performLayout() { + size = constraints.biggest; + boxSize = size; + } + + @override + double? computeDistanceToActualBaseline(TextBaseline baseline) { + return boxSize.height / 2.0; + } } void main() { + TestRenderingFlutterBinding.ensureInitialized(); + test('Intrinsics cache', () { final RenderBox test = RenderTestBox(); @@ -68,4 +84,34 @@ void main() { expect(test.getMinIntrinsicWidth(0.0), equals(1.0)); }); + + // Regression test for https://github.com/flutter/flutter/issues/101179 + test('Cached baselines should be clear if its parent re-layout', () { + double viewHeight = 200.0; + final RenderBox test = RenderTestBox(); + final RenderBox baseline = RenderBaseline( + baseline: 0.0, + baselineType: TextBaseline.alphabetic, + child: test, + ); + final RenderConstrainedBox root = RenderConstrainedBox( + additionalConstraints: BoxConstraints.tightFor(width: 200.0, height: viewHeight), + child: baseline, + ); + + layout(RenderPositionedBox( + child: root, + )); + + BoxParentData? parentData = test.parentData as BoxParentData?; + expect(parentData!.offset.dy, -(viewHeight / 2.0)); + + // Trigger the root render re-layout. + viewHeight = 300.0; + root.additionalConstraints = BoxConstraints.tightFor(width: 200.0, height: viewHeight); + pumpFrame(); + + parentData = test.parentData as BoxParentData?; + expect(parentData!.offset.dy, -(viewHeight / 2.0)); + }); } From 0286ab314f4b7460ced7ca64ca97fa052e01595e Mon Sep 17 00:00:00 2001 From: xubaolin Date: Thu, 7 Apr 2022 17:43:14 +0800 Subject: [PATCH 2/6] ++ --- packages/flutter/test/rendering/cached_intrinsics_test.dart | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/flutter/test/rendering/cached_intrinsics_test.dart b/packages/flutter/test/rendering/cached_intrinsics_test.dart index 2e2be1a61a83f..a34c504464889 100644 --- a/packages/flutter/test/rendering/cached_intrinsics_test.dart +++ b/packages/flutter/test/rendering/cached_intrinsics_test.dart @@ -86,7 +86,7 @@ void main() { }); // Regression test for https://github.com/flutter/flutter/issues/101179 - test('Cached baselines should be clear if its parent re-layout', () { + test('Cached baselines should be cleared if its parent re-layout', () { double viewHeight = 200.0; final RenderBox test = RenderTestBox(); final RenderBox baseline = RenderBaseline( From e1fe5a43c07e74a96ea0a5848223d556bf361459 Mon Sep 17 00:00:00 2001 From: xubaolin Date: Sat, 9 Apr 2022 11:50:34 +0800 Subject: [PATCH 3/6] feedback --- packages/flutter/lib/src/rendering/box.dart | 17 +++++++++----- .../rendering/cached_intrinsics_test.dart | 22 ++++++++++++++++++- 2 files changed, 33 insertions(+), 6 deletions(-) diff --git a/packages/flutter/lib/src/rendering/box.dart b/packages/flutter/lib/src/rendering/box.dart index 3cc89c0fa15ff..d8b2d9c60d474 100644 --- a/packages/flutter/lib/src/rendering/box.dart +++ b/packages/flutter/lib/src/rendering/box.dart @@ -1803,6 +1803,9 @@ abstract class RenderBox extends RenderObject { Map? _cachedDryLayoutSizes; bool _computingThisDryLayout = false; + bool _notifyParentIfDirty = false; + Constraints? _lastConstraints; + /// Returns the [Size] that this [RenderBox] would like to be given the /// provided [BoxConstraints]. /// @@ -2348,7 +2351,7 @@ abstract class RenderBox extends RenderObject { }()); } - bool _clearCachedData() { + void _clearCachedData() { if ((_cachedBaselines != null && _cachedBaselines!.isNotEmpty) || (_cachedIntrinsicDimensions != null && _cachedIntrinsicDimensions!.isNotEmpty) || (_cachedDryLayoutSizes != null && _cachedDryLayoutSizes!.isNotEmpty)) { @@ -2360,15 +2363,16 @@ abstract class RenderBox extends RenderObject { _cachedBaselines?.clear(); _cachedIntrinsicDimensions?.clear(); _cachedDryLayoutSizes?.clear(); - return true; + _notifyParentIfDirty = true; } - return false; } @override void markNeedsLayout() { - if (_clearCachedData() && parent is RenderObject) { + _clearCachedData(); + if (_notifyParentIfDirty && parent is RenderObject) { markParentNeedsLayout(); + _notifyParentIfDirty = false; return; } super.markNeedsLayout(); @@ -2376,7 +2380,10 @@ abstract class RenderBox extends RenderObject { @override void layout(Constraints constraints, {bool parentUsesSize = false}) { - _clearCachedData(); + if (constraints != _lastConstraints) { + _clearCachedData(); + _lastConstraints = constraints; + } super.layout(constraints, parentUsesSize: parentUsesSize); } diff --git a/packages/flutter/test/rendering/cached_intrinsics_test.dart b/packages/flutter/test/rendering/cached_intrinsics_test.dart index a34c504464889..756a4967d54dc 100644 --- a/packages/flutter/test/rendering/cached_intrinsics_test.dart +++ b/packages/flutter/test/rendering/cached_intrinsics_test.dart @@ -9,6 +9,7 @@ import 'rendering_tester.dart'; class RenderTestBox extends RenderBox { late Size boxSize; + int calls = 0; double value = 0.0; double next() { value += 1.0; @@ -31,6 +32,7 @@ class RenderTestBox extends RenderBox { @override double? computeDistanceToActualBaseline(TextBaseline baseline) { + calls += 1; return boxSize.height / 2.0; } } @@ -88,7 +90,7 @@ void main() { // Regression test for https://github.com/flutter/flutter/issues/101179 test('Cached baselines should be cleared if its parent re-layout', () { double viewHeight = 200.0; - final RenderBox test = RenderTestBox(); + final RenderTestBox test = RenderTestBox(); final RenderBox baseline = RenderBaseline( baseline: 0.0, baselineType: TextBaseline.alphabetic, @@ -105,6 +107,7 @@ void main() { BoxParentData? parentData = test.parentData as BoxParentData?; expect(parentData!.offset.dy, -(viewHeight / 2.0)); + expect(test.calls, 1); // Trigger the root render re-layout. viewHeight = 300.0; @@ -113,5 +116,22 @@ void main() { parentData = test.parentData as BoxParentData?; expect(parentData!.offset.dy, -(viewHeight / 2.0)); + expect(test.calls, 2); // The layout constraints change will clear the cached data. + + final RenderObject parent = test.parent! as RenderObject; + expect(parent.debugNeedsLayout, false); + + // Do not forget notify parent dirty after the cached data be cleared by `layout()` + test.markNeedsLayout(); + expect(parent.debugNeedsLayout, true); + + pumpFrame(); + expect(parent.debugNeedsLayout, false); + expect(test.calls, 3); // Self dirty will clear the cached data. + + parent.markNeedsLayout(); + pumpFrame(); + + expect(test.calls, 3); // Use the cached data if the layout constraints do not change. }); } From dc355bcc702fd7773306334436203d9384ae99eb Mon Sep 17 00:00:00 2001 From: xubaolin Date: Wed, 27 Apr 2022 10:45:23 +0800 Subject: [PATCH 4/6] feedback --- packages/flutter/lib/src/rendering/box.dart | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/packages/flutter/lib/src/rendering/box.dart b/packages/flutter/lib/src/rendering/box.dart index d8b2d9c60d474..0001ff7ad16eb 100644 --- a/packages/flutter/lib/src/rendering/box.dart +++ b/packages/flutter/lib/src/rendering/box.dart @@ -1804,7 +1804,6 @@ abstract class RenderBox extends RenderObject { bool _computingThisDryLayout = false; bool _notifyParentIfDirty = false; - Constraints? _lastConstraints; /// Returns the [Size] that this [RenderBox] would like to be given the /// provided [BoxConstraints]. @@ -2380,9 +2379,8 @@ abstract class RenderBox extends RenderObject { @override void layout(Constraints constraints, {bool parentUsesSize = false}) { - if (constraints != _lastConstraints) { + if (hasSize && constraints != this.constraints) { _clearCachedData(); - _lastConstraints = constraints; } super.layout(constraints, parentUsesSize: parentUsesSize); } From 2547dd8abd576bac26a02ef1bf085d4415e219a0 Mon Sep 17 00:00:00 2001 From: xubaolin Date: Fri, 29 Apr 2022 18:29:47 +0800 Subject: [PATCH 5/6] review feedbacl --- packages/flutter/lib/src/rendering/box.dart | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/flutter/lib/src/rendering/box.dart b/packages/flutter/lib/src/rendering/box.dart index 0001ff7ad16eb..2f1c905ae78aa 100644 --- a/packages/flutter/lib/src/rendering/box.dart +++ b/packages/flutter/lib/src/rendering/box.dart @@ -2379,8 +2379,11 @@ abstract class RenderBox extends RenderObject { @override void layout(Constraints constraints, {bool parentUsesSize = false}) { - if (hasSize && constraints != this.constraints) { - _clearCachedData(); + if (hasSize && constraints != this.constraints && + _cachedBaselines != null && _cachedBaselines!.isNotEmpty) { + // The cached baselines data may need update if the constraints change. + _cachedBaselines?.clear(); + _notifyParentIfDirty = true; } super.layout(constraints, parentUsesSize: parentUsesSize); } From 62e3c74380d5fe78804373fb8f7520665b6e001e Mon Sep 17 00:00:00 2001 From: xubaolin Date: Thu, 5 May 2022 10:24:03 +0800 Subject: [PATCH 6/6] feedback --- packages/flutter/lib/src/rendering/box.dart | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/packages/flutter/lib/src/rendering/box.dart b/packages/flutter/lib/src/rendering/box.dart index 2f1c905ae78aa..b72381a7171fa 100644 --- a/packages/flutter/lib/src/rendering/box.dart +++ b/packages/flutter/lib/src/rendering/box.dart @@ -1803,8 +1803,6 @@ abstract class RenderBox extends RenderObject { Map? _cachedDryLayoutSizes; bool _computingThisDryLayout = false; - bool _notifyParentIfDirty = false; - /// Returns the [Size] that this [RenderBox] would like to be given the /// provided [BoxConstraints]. /// @@ -2350,7 +2348,7 @@ abstract class RenderBox extends RenderObject { }()); } - void _clearCachedData() { + bool _clearCachedData() { if ((_cachedBaselines != null && _cachedBaselines!.isNotEmpty) || (_cachedIntrinsicDimensions != null && _cachedIntrinsicDimensions!.isNotEmpty) || (_cachedDryLayoutSizes != null && _cachedDryLayoutSizes!.isNotEmpty)) { @@ -2362,16 +2360,15 @@ abstract class RenderBox extends RenderObject { _cachedBaselines?.clear(); _cachedIntrinsicDimensions?.clear(); _cachedDryLayoutSizes?.clear(); - _notifyParentIfDirty = true; + return true; } + return false; } @override void markNeedsLayout() { - _clearCachedData(); - if (_notifyParentIfDirty && parent is RenderObject) { + if (_clearCachedData() && parent is RenderObject) { markParentNeedsLayout(); - _notifyParentIfDirty = false; return; } super.markNeedsLayout(); @@ -2383,7 +2380,6 @@ abstract class RenderBox extends RenderObject { _cachedBaselines != null && _cachedBaselines!.isNotEmpty) { // The cached baselines data may need update if the constraints change. _cachedBaselines?.clear(); - _notifyParentIfDirty = true; } super.layout(constraints, parentUsesSize: parentUsesSize); } pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy