我有2个带有更改通知程序的类,Product声明每个产品,ProductProvider包括产品列表和一些方法。我使用此代码创建了产品的GridView。
class GridList extends StatelessWidget {
@override
Widget build(BuildContext context) {
final productsData = Provider.of<ProductsProvider>(context);
final products = productsData.items;
return GridView.builder(
padding: const EdgeInsets.all(10.0),
itemCount: products.length,
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2,
childAspectRatio: 1,
crossAxisSpacing: 10.0,
mainAxisSpacing: 10.0),
itemBuilder: (ctx, i) {
return ChangeNotifierProvider(
create: (c) => products[i],
child: ProductItem(),
);
});
}
}
在ProductItem()中,我有一些小部件,但最重要的是,我有一个将产品添加到“收藏夹”的“图标”按钮和一个推到产品详细信息屏幕的按钮。
void toggleFavoriteStatus() {
isFavorite = !isFavorite;
notifyListeners();
}
IconButton(
icon: Icon(
product.isFavorite ? Icons.favorite : Icons.favorite_border),
color: Theme.of(context).accentColor,
onPressed: () {
product.toggleFavoriteStatus();
},
),
onTap: () {
Navigator.pushNamed(context, ProductDetailsScreen.routeName, arguments: product.id);
},
该图标确实在productItem()上变化不大,我希望在ProductDetailsScreen中具有相同的行为,该怎么做?
答案 0 :(得分:0)
我假设ProductDetailsScreen
是一个页面,其中显示了所开发产品的全部信息,在这种情况下,我建议传递“产品提供”作为参数,然后在{{1}中使用ChangeNotifierProvider.value()
}
ProductDetailsScreen
然后在ProductDetailsScreen中,只需在开始时将值传递给Navigator.pushNamed(
context,
ProductDetailsScreen.routeName,
arguments: Provider.of<Products>(context, listen: false) //I used Products but I don't know the name of your class you used to create the ChangeNotifierProvider
);
并开始与使用者一起使用
ChangeNotifierProvider.value()
现在,当您更新产品的价值时,它会在两个页面中更新,因此当您退货时,您也会看到更改