Метод didUpdateWidget
Метод didUpdateWidget класса State получает старый виджет и сравнивает его поля с widget. State при этом не пересоздают, в отличие от смены key. После метода фреймворк вызовет build.
Синтаксис
@override
void didUpdateWidget(covariant OldWidget oldWidget)
Параметры
| Параметр | Описание |
|---|---|
oldWidget |
Предыдущая конфигурация того же StatefulWidget.
Сравнивают поля с текущим widget.
|
Пример
Давайте синхронизируем поле State при смене текста виджета:
import 'package:flutter/material.dart';
void main()
{
runApp(const MaterialApp(home: SwapDemo()));
}
class SwapDemo extends StatefulWidget
{
const SwapDemo({super.key});
@override
State<SwapDemo> createState() => _SwapDemoState();
}
class _SwapDemoState extends State<SwapDemo>
{
var caption = 'abcde';
@override
Widget build(BuildContext context)
{
return Scaffold(
body: Center(
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
LabelText(text: caption),
ElevatedButton(
onPressed: () => setState(() {
caption = caption == 'abcde' ? '12345' : 'abcde';
}),
child: const Text('swap'),
),
],
),
),
);
}
}
class LabelText extends StatefulWidget
{
const LabelText({super.key, required this.text});
final String text;
@override
State<LabelText> createState() => _LabelTextState();
}
class _LabelTextState extends State<LabelText>
{
late String shown;
@override
void initState()
{
super.initState();
shown = widget.text;
}
@override
void didUpdateWidget(covariant LabelText oldWidget)
{
super.didUpdateWidget(oldWidget);
if (oldWidget.text != widget.text) {
shown = widget.text;
}
}
@override
Widget build(BuildContext context)
{
return Text(shown);
}
}
На экране didUpdateWidget обновит подпись, когда родитель передаст другой text.
Пример
Давайте выведем в консоль факт смены параметра:
import 'package:flutter/material.dart';
void main()
{
runApp(
MaterialApp(
home: Scaffold(
body: Center(
child: CounterHost(value: 1),
),
),
),
);
}
class CounterHost extends StatefulWidget
{
const CounterHost({super.key, required this.value});
final int value;
@override
State<CounterHost> createState() => _CounterHostState();
}
class _CounterHostState extends State<CounterHost>
{
@override
void didUpdateWidget(covariant CounterHost oldWidget)
{
super.didUpdateWidget(oldWidget);
print(oldWidget.value);
print(widget.value);
}
@override
Widget build(BuildContext context)
{
return Text('${widget.value}');
}
}
Результат выполнения кода
1
1
Смотрите также
-
класс
StatefulWidget,
конфигурация которого сравнивают вdidUpdateWidget -
метод
setState,
который обновляет поляStateбез смены виджета -
метод
build,
который идёт послеdidUpdateWidget -
метод
initState,
который задаёт начальные поля до первогоdidUpdateWidget