我想要这个 UI 颤动。 enter image description here
答案 0 :(得分:1)
这是我做了类似事情的代码。它有一个 GridView
,它显示 GridTile
,它有一个 FadeInImage
和一个 GridTileBar
。
class ProductsGrid extends StatelessWidget {
final favouritesOnly;
ProductsGrid(this.favouritesOnly);
@override
Widget build(BuildContext context) {
var productsProvider = Provider.of<Products>(context);
var products =
favouritesOnly ? productsProvider.favourites : productsProvider.items;
return GridView.builder(
padding: const EdgeInsets.all(10),
itemCount: products.length,
gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
crossAxisCount: 2,
childAspectRatio: 3 / 2,
crossAxisSpacing: 10,
mainAxisSpacing: 10,
),
itemBuilder: (context, index) => ChangeNotifierProvider.value(
value: products[index],
child: ProductItem(),
),
);
}
}
class ProductItem extends StatelessWidget {
@override
Widget build(BuildContext context) {
final product = Provider.of<Product>(context, listen: false);
final cart = Provider.of<Cart>(context, listen: false);
final auth = Provider.of<Auth>(context, listen: false);
final scaffold = Scaffold.of(context);
return ClipRRect(
borderRadius: BorderRadius.circular(10),
child: GridTile(
child: GestureDetector(
onTap: () {
Navigator.of(context).pushNamed(
ProductDetailScreen.routeName,
arguments: product.id,
);
},
child: FadeInImage(
placeholder: AssetImage('assets/images/product_placeholder.png'),
image: NetworkImage(product.imageUrl),
fit: BoxFit.cover,
),
),
footer: GridTileBar(
leading: Consumer<Product>(
builder: (context, product, child) => IconButton(
icon: Icon(product.isFavourite
? Icons.favorite
: Icons.favorite_border),
color: Theme.of(context).accentColor,
onPressed: () async {
try {
await product.toggleFavourite(auth.token, auth.userId);
} catch (error) {
print(error);
scaffold.showSnackBar(SnackBar(
content: Text(
error.toString(),
textAlign: TextAlign.center,
),
));
}
},
),
// child: optional invariant child widget to provide to builder
),
title: Text(
product.title,
textAlign: TextAlign.center,
),
trailing: IconButton(
icon: Icon(Icons.shopping_cart),
color: Theme.of(context).accentColor,
onPressed: () {
cart.addItem(product.id, product.title, product.price);
Scaffold.of(context).showSnackBar(SnackBar(
content: Text('Added item to cart'),
duration: Duration(seconds: 2),
action: SnackBarAction(
label: 'UNDO',
onPressed: () {
cart.removeSingleItem(product.id);
})));
},
),
backgroundColor: Colors.black87,
),
));
}
}