Как происходит обновление виджетов

Обновление виджетов

Flutter может вызывать метод build() в нескольких ситуациях:

Метод build() может быть вызван довольно часто и при этом не должен иметь никаких побочных эффектов, кроме создания виджета.

Переданный аргумент build(BuildContext context) содержит информацию о том месте в дереве, в котором создается этот виджет. Например, контекст предоставляет набор унаследованных виджетов для этого места в дереве. Аргумент BuildContext всегда совпадает со свойством контекста этого объекта State и остается неизменным в течение всего времени существования этого объекта.

Практический пример

Рассмотрим случай когда StatefulWidget находится внутри другого StatefulWidget и происходит вызов метода didUpdateWidget()

Файл 3_stateful_didUpdateWidget.dart
Светлая тема Темная тема

class TrackCardExample3 extends StatefulWidget {  
  const TrackCardExample3({super.key});  
  
  @override  
  State createState() => _TrackCardExample3State();  
}  
  
class _TrackCardExample3State extends State {  
  int counter = 0;  
  
  void _incCount() => setState(() {  
        counter++;  
      });  
  
  @override  
  Widget build(BuildContext context) {  
  
    debugPrint("🔵 TrackCardExample3 build (widget hash: ${identityHashCode(widget)})");  
    return Card(  
      color: Colors.white,  
      child: ListTile(  
        leading: Image.asset("assets/images/pro.webp"),  
        title: const TitleWidget(text: "Stateless"),  
        subtitle: const SubtitleWidget(text: "Flutter vibes"),  
        trailing: LikeButton(  
          text: "Like $counter",  
          incCount: _incCount,  
        ),  
      ),  
    );  
  }  
}  
  
class TitleWidget extends StatelessWidget {  
  final String text;  
  const TitleWidget({super.key, this.text = ""});  
  
  @override  
  Widget build(BuildContext context) {  
  
    debugPrint("🔵 TitleWidget build (widget hash: ${identityHashCode(this)})");  
  
    return Text(  
      text,  
      style: TextStyle(  
        fontWeight: FontWeight.bold,  
      ),  
    );  
  }  
}  
  
class SubtitleWidget extends StatelessWidget {  
  final String text;  
  
  const SubtitleWidget({super.key, this.text = ""});  
  @override  
  Widget build(BuildContext context) {  
  
    debugPrint("🔵 SubtitleWidget build (widget hash: ${identityHashCode(this)})");  
  
    return Text(text.toUpperCase());  
  }  
}  
  
class LikeButton extends StatefulWidget {  
  final String text;  
  final Function incCount;  
  const LikeButton({  
    super.key,  
    this.text = "",  
    required this.incCount,  
  });  
  
  @override  
  State createState() => _LikeButtonState();  
}  
  
class _LikeButtonState extends State {  
  bool isFavorite = false;  
  
  @override  
  void didUpdateWidget(covariant LikeButton oldWidget) {  
    super.didUpdateWidget(oldWidget);  
    debugPrint("LikeButton identityHashCode oldWidget = "  
        "${identityHashCode(oldWidget)}, "  
        "newWidget = ${identityHashCode(widget)}");  
  }  
  
  @override  
  Widget build(BuildContext context) {  
    debugPrint("🔵 LikeButton build isFavorite: $isFavorite, widget hash: ${identityHashCode(widget)}");  
  
    return Column(  
      mainAxisAlignment: MainAxisAlignment.center,  
      crossAxisAlignment: CrossAxisAlignment.center,  
      children: [  
        Expanded(  
          child: IconButton(  
            onPressed: () {  
              isFavorite = !isFavorite; // Не обязательно вызывать ещё один setState  
              widget.incCount(); // Вызываем функцию-колбэк из виджета TrackCard  
            },  
            icon: isFavorite  
                ? const Icon(Icons.favorite, color: Colors.red)  
                : const Icon(Icons.favorite_border),  
          ),  
        ),  
        Text(widget.text),  
      ],  
    );  
  }  
}
            

Как происходит обновление виджетов

Слайды. Как происходит обновление виджетов

StatefulWidget - шаг 1
StatefulWidget - шаг 2
StatefulWidget - шаг 3
StatefulWidget - шаг 4
StatefulWidget - шаг 5
StatefulWidget - шаг 6
StatefulWidget - шаг 7
StatefulWidget - шаг 8
StatefulWidget - шаг 9
StatefulWidget - шаг 10
StatefulWidget - шаг 11
StatefulWidget - шаг 12
StatefulWidget - шаг 13
StatefulWidget - шаг 14
StatefulWidget - шаг 15
StatefulWidget - шаг 16
StatefulWidget - шаг 17
StatefulWidget - шаг 18
StatefulWidget - шаг 19
StatefulWidget - шаг 20
StatefulWidget - шаг 21
StatefulWidget - шаг 22
StatefulWidget - шаг 23
StatefulWidget - шаг 24
StatefulWidget - шаг 25
StatefulWidget - шаг 26
StatefulWidget - шаг 27
StatefulWidget - шаг 28
StatefulWidget - шаг 29
StatefulWidget - шаг 30
StatefulWidget - шаг 31
StatefulWidget - шаг 32
StatefulWidget - шаг 33
StatefulWidget - шаг 34
StatefulWidget - шаг 35
StatefulWidget - шаг 36
StatefulWidget - шаг 37