gpt4 book ai didi

Flutter - InheritedModel 仍然会更新子项,即使它与某个方面不匹配

转载 作者:IT王子 更新时间:2023-10-29 07:12:47 25 4
gpt4 key购买 nike

美好的一天。我看过一个关于 Flutter 的 InheritedModel 的视频,并对它产生了兴趣。不幸的是,我似乎无法让它正常工作。


总结:需要有关如何正确实现 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 中更新。不幸的是,这不会发生。

最佳答案

简而言之,您应该使用const

将 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()),
...
);
}
}

瞧瞧 🎉

我已经描述了为什么会这样here 详细说明

关于Flutter - InheritedModel 仍然会更新子项,即使它与某个方面不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54006554/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com