Метод addPostFrameCallback
Метод addPostFrameCallback миксина WidgetsBinding вызывают на WidgetsBinding.instance.
Колбэк выполняется один раз после завершения текущего кадра.
Синтаксис
WidgetsBinding.instance.addPostFrameCallback((Duration timeStamp) {
// код
})
Параметры
| Параметр | Описание |
|---|---|
callback | Функция без возвращаемого значения, получает метку времени кадра. |
Пример
Давайте обновим текст после первого кадра:
import 'package:flutter/material.dart';
void main() => runApp(MaterialApp(home: Scaffold(body: Center(child: FrameTick()))));
class FrameTick extends StatefulWidget
{
const FrameTick({super.key});
@override
State<FrameTick> createState() => _FrameTickState();
}
class _FrameTickState extends State<FrameTick>
{
String label = '12345';
@override
void initState()
{
super.initState();
WidgetsBinding.instance.addPostFrameCallback((_) {
setState(() => label = 'abcde');
});
}
@override
Widget build(BuildContext context) => Text(label);
}
На экране сначала '12345', затем 'abcde'.
Пример
Давайте прочитаем context.size после layout:
import 'package:flutter/material.dart';
void main() => runApp(MaterialApp(home: Scaffold(body: SizeProbe())));
class SizeProbe extends StatefulWidget
{
const SizeProbe({super.key});
@override
State<SizeProbe> createState() => _SizeProbeState();
}
class _SizeProbeState extends State<SizeProbe>
{
String label = 'abcde';
@override
void initState()
{
super.initState();
WidgetsBinding.instance.addPostFrameCallback((_) {
final box = context.findRenderObject() as RenderBox?;
setState(() => label = box == null ? '12345' : 'ok');
});
}
@override
Widget build(BuildContext context) => Center(child: Text(label));
}
На экране после кадра текст сменится с 'abcde' на 'ok', если layout готов.
Смотрите также
-
миксин
SchedulerBinding,
который планирует сами кадры -
метод
scheduleFrameCallback,
который вызывают доlayout -
миксин
WidgetsBinding,
через instance вызываютaddPostFrameCallback -
метод
findRenderObject,
который удобно звать после кадра