我有带有收藏夹按钮、收藏夹屏幕和浏览屏幕的卡片小工具。当我从浏览屏幕中单击CardWidget收藏夹按钮时,它应该会自动显示在收藏夹屏幕中,但现在我必须刷新或热重新加载才能显示CardWidget,所以如果我能得到任何帮助或建议,我们将不胜感激。
我们正在使用带有ChangeNotificationProvider(消费者(的BaseView
卡片小工具收藏夹按钮
child: GestureDetector(
onTap: () {
setState(() {
final fm = FavoriteModel(
id: widget.id,
name: widget.name,
ordinal: widget.ordinal,
showCards: false,
items: []);
if (model.fav
.modelExists(fm.id) ==
-1) {
model.fav.addToFavorite(
fm.id, fm, widget.item);
}
if (widget.item.favorited) {
model.fav.removeFromFavorite(
fm.id, widget.item.id);
} else {
model.fav.addToFavorite(
fm.id, fm, widget.item);
}
});
},
child: Image(
color:
Theme.of(context).accentColor,
image: AssetImage(widget
.item.favorited
? 'assets/icons/more-icons/favorited-heart.png'
: 'assets/icons/more-icons/unfavorited-heart.png'),
fit: BoxFit.cover,
height: 20,
)),
我已经在这里上传了我最喜欢的屏幕,所以如果有人能看一看并帮助我解决问题,我将不胜感激。
https://docs.google.com/document/d/18d7KspFaqUTsAy-8QmrQ2MzmUEKb953GtS0J2mFSuIs/edit?usp=sharing
更新
将setState放在您调用addToFavvorite:的位置
if (model.fav.modelExists(fm.id) == -1) {
setState(() {
model.fav.addToFavorite(fm.id, fm, widget.item);
});
}
if (widget.item.favorited) {
setState(() {
model.fav.removeFromFavorite(fm.id, widget.item.id);
});
} else {
setState(() {
model.fav.addToFavorite(fm.id, fm, widget.item);
});
}
该函数将为您重建小部件,使用StatefulWidget使其工作。
setState(() {
//do stuff here
});
但是,如果您需要StatelessWidget,请考虑使用StatefulBuilder。
您没有提到您是如何进行路由的。您可以使用导航器路由到收藏夹页面。
onTap() {
Navigator.pushNamed(context, '/favouritePage');
}
如果您试图使用viewmodel/block进行导航,请确保不要忘记调用notifyListeners()
。
如果您确信视图模型没有问题,那么您的UI/Customer小部件可能有问题。
我认为缺陷在buildRow函数中发送的上下文中。(尝试在itemBuilder中重命名(
Widget build(BuildContext context){
(...)
ListView.builder(
(..)
itemBuilder: (cxt, i) {
return Column(
children: [
buildRow(model.fav.favorites[i], cxt,
this.runtimeType),
SizedBox(
height: 20,
)
],
);
},
}