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

Виджет InheritedWidget

Виджет InheritedWidget оборачивает child и хранит общие данные. Потомки читают их через dependOnInheritedWidgetOfExactType. При смене данных переопределяют updateShouldNotify.

Синтаксис

InheritedWidget( child: child, )

Параметры

Параметр Описание
child Поддерево, которое получит доступ к данным предка.
key Необязательный ключ виджета в дереве.

Методы

Метод Описание
updateShouldNotify Решает, перестраивать ли зависимых потомков.

Пример

Давайте передадим строку через InheritedWidget:

import 'package:flutter/material.dart'; void main() { runApp( MaterialApp( home: LabelScope( label: 'abcde', child: Scaffold( body: Center( child: LabelView(), ), ), ), ), ); } class LabelScope extends InheritedWidget { const LabelScope({super.key, required this.label, required super.child}); final String label; static LabelScope? maybeOf(BuildContext context) { return context.dependOnInheritedWidgetOfExactType<LabelScope>(); } @override bool updateShouldNotify(LabelScope oldWidget) => label != oldWidget.label; } class LabelView extends StatelessWidget { const LabelView({super.key}); @override Widget build(BuildContext context) { return Text(LabelScope.maybeOf(context)?.label ?? '12345'); } }

На экране LabelView покажет 'abcde' из LabelScope.

Пример

Давайте сменим label и обновим потомка:

import 'package:flutter/material.dart'; void main() { runApp(const MaterialApp(home: SwapScopeDemo())); } class LabelScope extends InheritedWidget { const LabelScope({super.key, required this.label, required super.child}); final String label; static LabelScope? maybeOf(BuildContext context) { return context.dependOnInheritedWidgetOfExactType<LabelScope>(); } @override bool updateShouldNotify(LabelScope oldWidget) => label != oldWidget.label; } class LabelView extends StatelessWidget { const LabelView({super.key}); @override Widget build(BuildContext context) { return Text(LabelScope.maybeOf(context)?.label ?? '12345'); } } class SwapScopeDemo extends StatefulWidget { const SwapScopeDemo({super.key}); @override State<SwapScopeDemo> createState() => _SwapScopeDemoState(); } class _SwapScopeDemoState extends State<SwapScopeDemo> { var label = 'abcde'; @override Widget build(BuildContext context) { return LabelScope( label: label, child: Scaffold( body: Center( child: Column( mainAxisSize: MainAxisSize.min, children: [ const LabelView(), ElevatedButton( onPressed: () => setState(() { label = label == 'abcde' ? '12345' : 'abcde'; }), child: const Text('swap'), ), ], ), ), ), ); } }

На экране кнопка swap сменит текст между двумя строками через InheritedWidget.

Смотрите также

  • метод updateShouldNotify,
    который решает, обновлять ли потомков
  • класс InheritedModel,
    который уведомляет только часть потомков
  • метод dependOnInheritedWidgetOfExactType,
    которым читают InheritedWidget
  • класс Widget,
    от которого наследует InheritedWidget
← →
↑
Мы используем cookie для работы сайта, аналитики и персонализации. Обработка данных происходит согласно Политике конфиденциальности.
принять все настроить отклонить