Виджет 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