Создаем портфолио за 1 месяц
К концу месяца: 4 классных проекта в вашем портфолио! Стоимость: 100$. Подробности...
769 of 1024 menu
◀ ▶

Метод 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
← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить