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

标签 flutter inherited-widget

美好的一天。我观看了一个有关 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 和一个 CountText 小部件,它使用来自 CountModel 的数据。正如您在 CountText 的实现中看到的,它在获取 CountModel 时通过了 test。根据我的理解,当 CountModel 中的 count 值更新时,它不应该更新。不幸的是,这并没有发生。

最佳答案

简而言之,您应该使用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/

相关文章:

dart - 你如何在 Flutter 中创建服务/提供者?

flutter - 如何在 flutter 中访问父窗口小部件的数据?

flutter - 如何放置隐藏参数并发送下一页

firebase - 将数据添加到Firestore

flutter - 是否可以通过 UDP/TCP 从 flutter 应用程序向 .NET 应用程序发送消息?

flutter - 如何在 Flutter 的对话框中访问 Provider 提供者

flutter - 使用InheritedWidget在子级中触发触发器 Action

dart - 在flutter中使用ancestorInheritedElementForWidgetOfExactType

flutter - 嵌套json数据的序列化

flutter - ImagePicker,如何再次设置图像?