From a69567a36f696e0bb241706c51e4c5e93d14bcf6 Mon Sep 17 00:00:00 2001 From: LongCatIsLooong <31859944+LongCatIsLooong@users.noreply.github.com> Date: Thu, 14 Mar 2024 09:43:00 -0700 Subject: [PATCH] Asserts if a `TextPainter` gets disposed more than once (#145124) The overflow indicator was sharing the same `TextPainter`. --- packages/flutter/lib/src/painting/text_painter.dart | 1 + .../flutter/lib/src/rendering/debug_overflow_indicator.dart | 5 +++-- packages/flutter/test/painting/text_painter_test.dart | 6 ++++++ 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/packages/flutter/lib/src/painting/text_painter.dart b/packages/flutter/lib/src/painting/text_painter.dart index 080ae929282..356158a6c99 100644 --- a/packages/flutter/lib/src/painting/text_painter.dart +++ b/packages/flutter/lib/src/painting/text_painter.dart @@ -1659,6 +1659,7 @@ class TextPainter { /// /// After disposal this painter is unusable. void dispose() { + assert(!debugDisposed); assert(() { _disposed = true; return true; diff --git a/packages/flutter/lib/src/rendering/debug_overflow_indicator.dart b/packages/flutter/lib/src/rendering/debug_overflow_indicator.dart index c68caa8874d..cfb0812194e 100644 --- a/packages/flutter/lib/src/rendering/debug_overflow_indicator.dart +++ b/packages/flutter/lib/src/rendering/debug_overflow_indicator.dart @@ -109,9 +109,10 @@ mixin DebugOverflowIndicatorMixin on RenderObject { ); static final Paint _labelBackgroundPaint = Paint()..color = const Color(0xFFFFFFFF); - final List _indicatorLabel = List.filled( + final List _indicatorLabel = List.generate( _OverflowSide.values.length, - TextPainter(textDirection: TextDirection.ltr), // This label is in English. + (int i) => TextPainter(textDirection: TextDirection.ltr), // This label is in English. + growable: false, ); @override diff --git a/packages/flutter/test/painting/text_painter_test.dart b/packages/flutter/test/painting/text_painter_test.dart index 004e306f734..bf1b11da18d 100644 --- a/packages/flutter/test/painting/text_painter_test.dart +++ b/packages/flutter/test/painting/text_painter_test.dart @@ -1429,6 +1429,12 @@ void main() { expect(painter.debugDisposed, true); }); + test('TextPainter - asserts if disposed more than once', () { + final TextPainter painter = TextPainter()..dispose(); + expect(painter.debugDisposed, isTrue); + expect(painter.dispose, throwsAssertionError); + }); + test('TextPainter computeWidth', () { const InlineSpan text = TextSpan(text: 'foobar'); final TextPainter painter = TextPainter(text: text, textDirection: TextDirection.ltr);