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.
92 lines
2.5 KiB
Dart
92 lines
2.5 KiB
Dart
// Copyright 2015 The Chromium Authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
import 'dart:ui' as ui;
|
|
|
|
import 'package:flutter/rendering.dart';
|
|
|
|
class _BaselinePainter extends CustomPainter {
|
|
const _BaselinePainter({
|
|
this.paragraph
|
|
});
|
|
|
|
final RenderParagraph paragraph;
|
|
|
|
void paint(Canvas canvas, Size size) {
|
|
double baseline = paragraph.getDistanceToBaseline(TextBaseline.alphabetic);
|
|
double w = paragraph.getMaxIntrinsicWidth(new BoxConstraints.loose(size));
|
|
double h = paragraph.getMaxIntrinsicHeight(new BoxConstraints.loose(size));
|
|
Path path = new Path();
|
|
path.moveTo(0.0, 0.0);
|
|
path.lineTo(w, 0.0);
|
|
path.moveTo(0.0, baseline);
|
|
path.lineTo(w, baseline);
|
|
path.moveTo(0.0, h);
|
|
path.lineTo(w, h);
|
|
Paint paint = new Paint()
|
|
..color = const Color(0xFFFF9000)
|
|
..style = ui.PaintingStyle.stroke
|
|
..strokeWidth = 3.0;
|
|
canvas.drawPath(path, paint);
|
|
}
|
|
|
|
// TODO(abarth): We have no good way of detecting when the paragraph's intrinsic dimensions change.
|
|
bool shouldRepaint(_BaselinePainter oldPainter) => true;
|
|
}
|
|
|
|
RenderBox getBox(double lh) {
|
|
RenderParagraph paragraph = new RenderParagraph(
|
|
new StyledTextSpan(
|
|
new TextStyle(
|
|
color: const Color(0xFF0000A0)
|
|
),
|
|
<TextSpan>[
|
|
new PlainTextSpan('test'),
|
|
new StyledTextSpan(
|
|
new TextStyle(
|
|
fontFamily: 'serif',
|
|
fontSize: 50.0,
|
|
height: lh
|
|
),
|
|
<TextSpan>[new PlainTextSpan('مرحبا Hello')]
|
|
)
|
|
]
|
|
)
|
|
);
|
|
return new RenderPadding(
|
|
padding: new EdgeDims.all(10.0),
|
|
child: new RenderConstrainedBox(
|
|
additionalConstraints: new BoxConstraints.tightFor(height: 200.0),
|
|
child: new RenderDecoratedBox(
|
|
decoration: new BoxDecoration(
|
|
backgroundColor: const Color(0xFFFFFFFF)
|
|
),
|
|
child: new RenderPadding(
|
|
padding: new EdgeDims.all(10.0),
|
|
child: new RenderCustomPaint(
|
|
painter: new _BaselinePainter(
|
|
paragraph: paragraph
|
|
),
|
|
child: paragraph
|
|
)
|
|
)
|
|
)
|
|
)
|
|
);
|
|
}
|
|
|
|
void main() {
|
|
RenderBox root = new RenderFlex(children: <RenderBox>[
|
|
new RenderConstrainedBox(
|
|
additionalConstraints: new BoxConstraints.tightFor(height: 50.0)
|
|
),
|
|
getBox(1.0),
|
|
getBox(null),
|
|
],
|
|
direction: FlexDirection.vertical,
|
|
alignItems: FlexAlignItems.stretch
|
|
);
|
|
new FlutterBinding(root: root);
|
|
}
|