首页 > 解决方案 > 继承的小部件不会更新其他小部件

问题描述

所以我有一个具有计数器数据的继承小部件

class FavProvider extends InheritedWidget 
{
  FavProvider({Key key, this.child}) : super(key: key, child: child);

  final Widget child;
  int counter =0;
  // bool fav = true;
  // var favIcon = Icon(Icons.favorite_border, size: 20, color: Colors.black,);
  static FavProvider of(BuildContext context) {
    return context.dependOnInheritedWidgetOfExactType<FavProvider>();
  }

  @override
  bool updateShouldNotify(FavProvider oldWidget) 
  {
    if(oldWidget.counter != counter)
      return true;
    return false;
  }
}

我不想把整个代码放在这里,因为它很大,但我会解释这个想法

我有一个 HomePage 类,其中包含一个包含许多 Hero() 小部件的 ListView,我构建的一个名为 ListItem() 的类负责根据我给它的属性返回 Hero 小部件,我还有另一个名为 HeroPage() 的类这是我们在单击 Hero 小部件后要转换到的页面。

负责创建 Hero 小部件的 ListItem 类,它创建一个包裹 Gesture Detector 的按钮

GestureDetector
(
  child: Text(ptr.counter.toString(), style: TextStyle(fontSize: 20,), ),
  onTap: _counterClick,
),

这是 _counterClick 方法

  _counterClick()
  {
    setState(() 
    {
      FavProvider.of(context).counter++;
    });
  }

HeroPage(我们在点击 Hero 小部件后转换到的页面)也有类似的按钮:

GestureDetector
(
  child: Text(ptr.counter.toString(), style: TextStyle(fontSize: 20,), ),
  onTap: _counterClick,
),

和类似的方法

  _counterClick()
  {
    setState(() 
    {
      FavProvider.of(context).counter++;
    });
  }

所以它们是不同的按钮但相同的数据,ListView 有 3 个 ListItem() 元素,所以我们得到了 3 个 Hero 小部件,每个小部件在 HomePage 中都有不同的标签,当点击每一个时,它会导致带有标签的 HeroPage()我们点击的那个

问题是当我单击英雄小部件时,我可以转到 HeroPage 并单击按钮以增加计数器我可以看到计数器增加但是当我返回主页时,我看不到任何变化3 小部件,除非我单击增加计数器的按钮(在 HomePage 中的按钮上的按钮而不是在 HeroPage 中)并且更改仅发生在我单击的小部件上,即使我们只有一个与所有相关联的计数器两个页面中的按钮

标签: flutter

解决方案


推荐阅读