Метод markNeedsLayout
Метод markNeedsLayout класса
TextPainter сбрасывает результат прошлого
layout.
Вызывают после смены text или textDirection,
затем снова вызывают layout. Метод ничего не возвращает.
Синтаксис
painter.markNeedsLayout()
Пример
Давайте сменим текст и перерисуем подпись:
import 'package:flutter/material.dart';
void main()
{
runApp(
MaterialApp(
home: Scaffold(
body: Center(
child: CustomPaint(
painter: _RelayoutPainter(),
size: Size(120, 30),
),
),
),
),
);
}
class _RelayoutPainter extends CustomPainter
{
@override
void paint(Canvas canvas, Size size)
{
TextPainter painter = TextPainter(
text: TextSpan(
text: 'abcde',
style: TextStyle(color: Colors.black),
),
textDirection: TextDirection.ltr,
);
painter.layout(maxWidth: size.width);
painter.text = TextSpan(
text: '12345',
style: TextStyle(color: Colors.blue),
);
painter.markNeedsLayout();
painter.layout(maxWidth: size.width);
painter.paint(canvas, Offset.zero);
}
@override
bool shouldRepaint(covariant CustomPainter oldDelegate) => false;
}
На экране синяя '12345' вместо старой строки:
markNeedsLayout заставил заново вызвать layout.
Пример
Давайте сменим направление текста и переложим блок:
import 'package:flutter/material.dart';
void main()
{
runApp(
MaterialApp(
home: Scaffold(
body: Center(
child: CustomPaint(
painter: _DirectionPainter(),
size: Size(120, 30),
),
),
),
),
);
}
class _DirectionPainter extends CustomPainter
{
@override
void paint(Canvas canvas, Size size)
{
TextPainter painter = TextPainter(
text: TextSpan(
text: 'abcde',
style: TextStyle(color: Colors.black),
),
textDirection: TextDirection.ltr,
);
painter.layout(maxWidth: size.width);
painter.textDirection = TextDirection.rtl;
painter.markNeedsLayout();
painter.layout(maxWidth: size.width);
painter.paint(canvas, Offset.zero);
}
@override
bool shouldRepaint(covariant CustomPainter oldDelegate) => false;
}
На экране порядок символов учтёт RTL после повторного layout.
Смотрите также
-
метод
layout,
который выполняет расчёт послеmarkNeedsLayout -
метод
paint,
который нельзя вызывать без актуального layout -
класс
TextPainter,
к которому относится метод -
класс
TextSpan,
смена которого часто требуетmarkNeedsLayout