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

瞧瞧

我已经详细描述了发生这种情况的原因