Метод findRenderObject
Метод findRenderObject класса BuildContext даёт доступ к объекту компоновки и отрисовки текущего элемента. До первого кадра может вернуть null. Размер и положение читают у RenderBox после монтирования.
Синтаксис
RenderObject? findRenderObject()
Пример
Давайте прочитаем ширину Text после layout:
import 'package:flutter/material.dart';
import 'package:flutter/rendering.dart';
void main()
{
runApp(
MaterialApp(
home: Scaffold(
body: Center(
child: SizeReporter(),
),
),
),
);
}
class SizeReporter extends StatefulWidget
{
const SizeReporter({super.key});
@override
State<SizeReporter> createState() => _SizeReporterState();
}
class _SizeReporterState extends State<SizeReporter>
{
String label = 'abcde';
@override
void initState()
{
super.initState();
WidgetsBinding.instance.addPostFrameCallback((_) {
final ro = context.findRenderObject();
if (ro is RenderBox) {
setState(() => label = '12345 ${ro.size.width.toStringAsFixed(0)}');
}
});
}
@override
Widget build(BuildContext context)
{
return Text(label);
}
}
На экране findRenderObject допишет ширину к '12345' после кадра.
Пример
Давайте выведем тип RenderObject в консоль:
import 'package:flutter/material.dart';
void main()
{
runApp(
MaterialApp(
home: Scaffold(
body: Center(
child: Builder(
builder: (context) {
WidgetsBinding.instance.addPostFrameCallback((_) {
final ro = context.findRenderObject();
print(ro.runtimeType.toString().contains('Render'));
});
return const Text('abcde');
},
),
),
),
),
);
}
Результат выполнения кода
true
Смотрите также
-
класс
BuildContext,
у которого вызываютfindRenderObject -
виджет
Builder,
который даёт context после вставки в дерево -
метод
findAncestorStateOfType,
который ищетState, а неRenderObject -
класс
Widget,
чей элемент связан сRenderObject