Flutter - InheritedModel по-прежнему обновляет дочерний объект, даже если он не соответствует аспекту
Добрый день. Я посмотрел видео о InheritedModel Flutter и заинтересовался им. К сожалению, я не могу заставить его работать должным образом.
Резюме: Нужна помощь, как правильно реализовать InheritedModel.
Ожидаемый вывод кода: виджет CountText
не должен обновляться при обновлении count
параметр в CountModel
,
Фактический вывод кода: CountText
все еще обновляет (я думаю, что это связано с тем, что родительский виджет является StatefulWidget
)
подробности
Я пытаюсь реализовать Counter
приложение, использующее InheritedModel
, Код ниже мой код
import 'package:flutter/material.dart';
class CountModel extends InheritedModel<String> {
final int count;
CountModel({ this.count, child }) : super(child: child);
@override
bool updateShouldNotify(CountModel oldWidget) {
if (oldWidget.count != count) {
return true;
}
return false;
}
@override
bool updateShouldNotifyDependent(InheritedModel<String> oldWidget, Set<String> dependencies) {
if (dependencies.contains('counter')) {
return true;
}
return false;
}
static CountModel of(BuildContext context, String aspect) {
return InheritedModel.inheritFrom<CountModel>(context, aspect: aspect);
}
}
class App extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Counter',
theme: Theme.of(context),
home: Counter(),
);
}
}
class Counter extends StatefulWidget {
@override
CounterState createState() => CounterState();
}
class CounterState extends State<Counter> {
int count = 0;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
// title: Text("Counter"),
),
body: CountModel(
count: count,
child: CounterText()
),
floatingActionButton: FloatingActionButton(
onPressed: () {
setState(() {
++count;
});
},
child: Icon(Icons.add),
),
);
}
}
class CounterText extends StatelessWidget {
@override
Widget build(BuildContext context) {
CountModel model = CountModel.of(context, 'test');
return Text('Count: ${model.count}');
}
}
У меня есть CountModel как InheritedModel
и CountText
виджет, который потребляет данные из CountModel
, Как вы можете видеть в реализации CountText
Пройдите test
при получении CountModel
, В моем понимании это не должно быть обновлено, когда count
значение обновляется в CountModel. К сожалению, этого не происходит.
1 ответ
Короче говоря, вы должны использовать const.
Добавить const в конструктор CounterText
class CounterText extends StatelessWidget {
const CounterText();
...
}
и использовать const при создании экземпляра CounterText () (const CounterText ())
class CounterState extends State<Counter> {
...
@override
Widget build(BuildContext context) {
return Scaffold(
...
body: CountModel(..., child: const CounterText()),
...
);
}
}
И вуаля
Я подробно описал, почему это происходит здесь