Метод updateShouldNotifyDependent
Метод updateShouldNotifyDependent виджета InheritedModel получает старый виджет и множество аспектов, от которых зависит один элемент. Возвращает true, если по этим аспектам данные изменились.
Синтаксис
@override
bool updateShouldNotifyDependent(
covariant OldWidget oldWidget,
Set<Object?> dependencies,
)
Параметры
| Параметр | Описание |
|---|---|
oldWidget |
Предыдущая конфигурация InheritedModel.
|
dependencies |
Набор аспектов, на которые подписан один потомок. |
Пример
Давайте уведомим только потомков аспекта count:
import 'package:flutter/material.dart';
void main()
{
runApp(const MaterialApp(home: DependHost()));
}
enum PairAspect { title, count }
class DependHost extends StatefulWidget
{
const DependHost({super.key});
@override
State<DependHost> createState() => _DependHostState();
}
class _DependHostState extends State<DependHost>
{
var title = 'abcde';
var count = 0;
@override
Widget build(BuildContext context)
{
return PairModel(
title: title,
count: count,
child: Scaffold(
body: Center(
child: Column(
mainAxisSize: MainAxisSize.min,
children: [
const CountOnly(),
ElevatedButton(
onPressed: () => setState(() => count++),
child: const Text('add'),
),
],
),
),
),
);
}
}
class PairModel extends InheritedModel<PairAspect>
{
const PairModel({super.key, required this.title, required this.count, required super.child});
final String title;
final int count;
static PairModel of(BuildContext context, PairAspect aspect) {
return InheritedModel.inheritFrom<PairModel, PairAspect>(context, aspect: aspect)!;
}
@override
bool updateShouldNotify(PairModel oldWidget) => true;
@override
bool updateShouldNotifyDependent(PairModel oldWidget, Set<PairAspect> dependencies) {
if (dependencies.contains(PairAspect.count) && count != oldWidget.count) {
return true;
}
if (dependencies.contains(PairAspect.title) && title != oldWidget.title) {
return true;
}
return false;
}
}
class CountOnly extends StatelessWidget
{
const CountOnly({super.key});
@override
Widget build(BuildContext context)
{
final model = PairModel.of(context, PairAspect.count);
return Text('12345 ${model.count}');
}
}
На экране updateShouldNotifyDependent обновит '12345' при росте count.
Пример
Давайте проверим метод вне дерева:
import 'package:flutter/material.dart';
void main()
{
const oldM = DemoModel(flag: false, child: SizedBox.shrink());
const newM = DemoModel(flag: true, child: SizedBox.shrink());
print(newM.updateShouldNotifyDependent(oldM, {DemoAspect.flag}));
}
enum DemoAspect { flag }
class DemoModel extends InheritedModel<DemoAspect>
{
const DemoModel({super.key, required this.flag, required super.child});
final bool flag;
@override
bool updateShouldNotify(DemoModel oldWidget) => flag != oldWidget.flag;
@override
bool updateShouldNotifyDependent(DemoModel oldWidget, Set<DemoAspect> dependencies) {
return dependencies.contains(DemoAspect.flag) && flag != oldWidget.flag;
}
}
Результат выполнения кода
true
Смотрите также
-
виджет
InheritedModel,
к которому относитсяupdateShouldNotifyDependent -
метод
updateShouldNotify,
который уведомляет всех зависимых сразу -
виджет
InheritedWidget,
базовый класс модели -
метод
dependOnInheritedWidgetOfExactType,
который регистрирует зависимость