Flutter 颤振-继承的模型仍然更新子对象,即使它与某个方面不匹配

Flutter 颤振-继承的模型仍然更新子对象,即使它与某个方面不匹配,flutter,inherited-widget,Flutter,Inherited Widget,你好。我看了一段关于弗利特继承模型的视频,对它很感兴趣。不幸的是,我似乎无法使它正常工作 小结:需要帮助如何正确实现InheritedModel 预期的代码输出:在更新CountModel中的count参数时,不应更新小部件CountText 实际代码输出:CountText仍在更新(我认为这是因为父窗口小部件是一个StatefulWidget) 详细信息 我正在尝试使用InheritedModel实现一个计数器应用程序。下面的代码是我的代码 import 'package:flutter/

你好。我看了一段关于弗利特继承模型的视频,对它很感兴趣。不幸的是,我似乎无法使它正常工作


小结:需要帮助如何正确实现InheritedModel

预期的代码输出:在更新CountModel中的count参数时,不应更新小部件CountText

实际代码输出CountText仍在更新(我认为这是因为父窗口小部件是一个StatefulWidget


详细信息 我正在尝试使用
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{
最终整数计数;
CountModel({this.count,child}):super(child:child);
@凌驾
bool updateShouldNotify(CountModel oldWidget){
if(oldWidget.count!=计数){
返回true;
}
返回false;
}
@凌驾
bool updateShouldNotifyDependent(继承的模型oldWidget,设置依赖项){
if(dependencies.contains('counter')){
返回true;
}
返回false;
}
的静态计数模型(BuildContext上下文、字符串方面){
返回InheritedModel.inheritFrom(上下文,方面:方面);
}
}
类应用程序扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
返回材料PP(
标题:"柜台",,
主题:主题(上下文),
主页:计数器(),
);
}
}
类计数器扩展StatefulWidget{
@凌驾
CounterState createState()=>CounterState();
}
类反状态扩展状态{
整数计数=0;
@凌驾
小部件构建(构建上下文){
返回脚手架(
appBar:appBar(
//标题:文本(“计数器”),
),
正文:CountModel(
伯爵:伯爵,
子对象:CounterText()
),
浮动操作按钮:浮动操作按钮(
已按下:(){
设置状态(){
++计数;
});
},
子:图标(Icons.add),
),
);
}
}
类CounterText扩展了无状态小部件{
@凌驾
小部件构建(构建上下文){
CountModel model=CountModel.of(上下文“test”);
返回文本('Count:${model.Count}');
}  
}


我有一个CountModel作为
InheritedModel
和一个
CountText
小部件,它使用
CountModel
中的数据。正如您在
CountText
的实现中所看到的,当获取
CountModel
时,它通过了
test
。根据我的理解,在CountModel中更新
count
值时,不应更新它。不幸的是,这并没有发生。

简而言之,您应该使用常量

将常量添加到计数器文本构造函数

class CounterText extends StatelessWidget {
  const CounterText();
  ...
}
并在创建CounterText()的实例(const CounterText())时使用const

类计数器状态扩展状态{
...
@凌驾
小部件构建(构建上下文){
返回脚手架(
...
正文:CountModel(…,子项:const CounterText()),
...
);
}
}

瞧,你好@maksimr谢谢~!我是按照你的指导来做的D
class CounterState extends State<Counter> {
  ...

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      ...
      body: CountModel(..., child: const CounterText()),
      ...
    );
  }
}