Flutter - InheritedModel 仍然会更新子项,即使它与某个方面不匹配
Flutter - InheritedModel still update child even if it does not match an aspect
美好的一天。我看过一个关于 Flutter 的 InheritedModel 的视频,并对它产生了兴趣。不幸的是,我似乎无法让它正常工作。
总结:需要有关如何正确实施 InheritedModel 的帮助。
预期代码输出: 更新 CountModel
中的 count
参数时不应更新小部件 CountText
。
实际代码输出:CountText
仍在更新(我认为这是因为父小部件是 StatefulWidget
)
详情
我正在尝试使用 InheritedModel
实现 Counter
应用程序。下面的代码是我的代码
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
和一个使用来自 CountModel
的数据的 CountText
小部件。正如您在 CountText
的实现中看到的那样,它在获取 CountModel
时传递 test
。以我的理解,在 CountModel 中更新 count
值时不应更新它。不幸的是,这并没有发生。
简而言之,你应该使用const。
将常量添加到 CounterText 构造函数
class CounterText extends StatelessWidget {
const CounterText();
...
}
并在创建 CounterText() 实例时使用 const (const CounterText())
class CounterState extends State<Counter> {
...
@override
Widget build(BuildContext context) {
return Scaffold(
...
body: CountModel(..., child: const CounterText()),
...
);
}
}
瞧瞧
我已经详细描述了发生这种情况的原因
美好的一天。我看过一个关于 Flutter 的 InheritedModel 的视频,并对它产生了兴趣。不幸的是,我似乎无法让它正常工作。
总结:需要有关如何正确实施 InheritedModel 的帮助。
预期代码输出: 更新 CountModel
中的 count
参数时不应更新小部件 CountText
。
实际代码输出:CountText
仍在更新(我认为这是因为父小部件是 StatefulWidget
)
详情
我正在尝试使用 InheritedModel
实现 Counter
应用程序。下面的代码是我的代码
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
和一个使用来自 CountModel
的数据的 CountText
小部件。正如您在 CountText
的实现中看到的那样,它在获取 CountModel
时传递 test
。以我的理解,在 CountModel 中更新 count
值时不应更新它。不幸的是,这并没有发生。
简而言之,你应该使用const。
将常量添加到 CounterText 构造函数
class CounterText extends StatelessWidget {
const CounterText();
...
}
并在创建 CounterText() 实例时使用 const (const CounterText())
class CounterState extends State<Counter> {
...
@override
Widget build(BuildContext context) {
return Scaffold(
...
body: CountModel(..., child: const CounterText()),
...
);
}
}
瞧瞧
我已经详细描述了发生这种情况的原因