mirror of
https://github.com/flutter/flutter.git
synced 2025-06-03 00:51:18 +00:00

Many of the widgets that use CustomPaint were spamming repaints because CustomPaint repaints when the identity of the onPaint callback changes, which it does every build for StatelessComponents. This patch changes CustomPaint to use a CustomPainter, similar to the new custom layout widgets. The CustomPainter has a `shouldRepaint` function along with its `paint` function. This function gives clients explicit control over when the custom paint object repaints.
47 lines
1.4 KiB
Dart
47 lines
1.4 KiB
Dart
import 'package:flutter/material.dart';
|
|
import 'package:flutter/rendering.dart';
|
|
import 'package:test/test.dart';
|
|
|
|
import 'rendering_tester.dart';
|
|
|
|
void main() {
|
|
test("overflow should not affect baseline", () {
|
|
RenderBox root, child, text;
|
|
double baseline1, baseline2, height1, height2;
|
|
|
|
root = new RenderPositionedBox(
|
|
child: new RenderCustomPaint(
|
|
child: child = text = new RenderParagraph(new PlainTextSpan('Hello World')),
|
|
painter: new TestCallbackPainter(
|
|
onPaint: () {
|
|
baseline1 = child.getDistanceToBaseline(TextBaseline.alphabetic);
|
|
height1 = text.size.height;
|
|
}
|
|
)
|
|
)
|
|
);
|
|
layout(root, phase: EnginePhase.paint);
|
|
|
|
root = new RenderPositionedBox(
|
|
child: new RenderCustomPaint(
|
|
child: child = new RenderOverflowBox(
|
|
child: text = new RenderParagraph(new PlainTextSpan('Hello World')),
|
|
maxHeight: height1 / 2.0
|
|
),
|
|
painter: new TestCallbackPainter(
|
|
onPaint: () {
|
|
baseline2 = child.getDistanceToBaseline(TextBaseline.alphabetic);
|
|
height2 = text.size.height;
|
|
}
|
|
)
|
|
)
|
|
);
|
|
layout(root, phase: EnginePhase.paint);
|
|
|
|
expect(baseline1, lessThan(height1));
|
|
expect(height2, equals(height1 / 2.0));
|
|
expect(baseline2, equals(baseline1));
|
|
expect(baseline2, greaterThan(height2));
|
|
});
|
|
}
|