监听嵌套提供程序中的更改

时间:2020-07-02 12:38:58

标签: flutter provider mobile-development

我有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()上变化不大,我希望在ProductDetailsS​​creen中具有相同的行为,该怎么做?

1 个答案:

答案 0 :(得分:0)

我假设ProductDetailsScreen是一个页面,其中显示了所开发产品的全部信息,在这种情况下,我建议传递“产品提供”作为参数,然后在{{1}中使用ChangeNotifierProvider.value() }

ProductDetailsScreen

然后在ProductDetailsS​​creen中,只需在开始时将值传递给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()

现在,当您更新产品的价值时,它会在两个页面中更新,因此当您退货时,您也会看到更改