Toko: Grid Produk
Termasuk bagian Proyek dalam perjalanan Flutter di Coddy. Pelajaran 19 dari 36.
Aplikasi ketiga adalah toko kecil: kisi produk, halaman untuk setiap produk, keranjang, dan pembayaran. Bentuknya seperti kebanyakan aplikasi belanja, dan aplikasi ini kembali menggunakan Provider dan intl.
Produk sudah tersedia di starter, masing-masing dengan nama, harga, ikon, warna, dan deskripsi. Toko menampilkannya dalam kisi, dua produk per baris di ponsel:
GridView.count(
crossAxisCount: 2,
padding: const EdgeInsets.all(16),
mainAxisSpacing: 12,
crossAxisSpacing: 12,
childAspectRatio: 0.8,
children: [for (Product product in products) ProductCard(product: product)],
)childAspectRatio adalah lebar dibagi tinggi: 0.8 membuat setiap kartu sedikit lebih tinggi daripada lebarnya, sehingga ada ruang untuk gambar dan dua baris teks.
Setiap kartu adalah widget tersendiri, ProductCard, yang menerima Product. Di dalamnya, tile Expanded mengisi ruang di atas nama. Warnanya adalah nuansa paling terang dari warna produk, product.color.shade50, dengan ikon dalam warna penuh di atasnya. Itulah alasan color bertipe MaterialColor: tipe ini memiliki nuansa-nuansa warna.
Tantangan
SedangTampilkan produk:
- tulis widget
ProductCardyang menerimarequiredproduct - widget ini berupa
Card(denganclipBehavior: Clip.antiAlias) yang menampungColumn:ContainerExpandedselebar penuh dengan warnaproduct.color.shade50dan ikon produk di tengah (ukuran 56,product.color), lalu nama dengantitleMediumdan padding 12 piksel - ganti
CenterdenganGridView.countdari teori
Coba sendiri
import 'package:flutter/material.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
theme: ThemeData(
colorScheme: ColorScheme.fromSeed(seedColor: Colors.orange),
),
home: const ShopScreen(),
);
}
}
class Product {
const Product({
required this.name,
required this.price,
required this.icon,
required this.color,
required this.description,
});
final String name;
final double price;
final IconData icon;
final MaterialColor color;
final String description;
}
const List<Product> products = [
Product(
name: 'Headphones',
price: 59,
icon: Icons.headphones,
color: Colors.indigo,
description: 'Wireless headphones with 30 hours of battery.',
),
Product(
name: 'Watch',
price: 129,
icon: Icons.watch,
color: Colors.teal,
description: 'A smart watch that counts your steps.',
),
Product(
name: 'Backpack',
price: 45.5,
icon: Icons.backpack,
color: Colors.orange,
description: 'Room for a laptop, a lunch and a jacket.',
),
Product(
name: 'Mug',
price: 12,
icon: Icons.coffee,
color: Colors.brown,
description: 'Holds a big coffee and keeps it warm.',
),
Product(
name: 'Camera',
price: 1299,
icon: Icons.photo_camera,
color: Colors.blueGrey,
description: 'A mirrorless camera for sharp photos.',
),
Product(
name: 'Sneakers',
price: 89.99,
icon: Icons.directions_run,
color: Colors.red,
description: 'Light running shoes for every day.',
),
];
class ShopScreen extends StatelessWidget {
const ShopScreen({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(title: const Text('Coddy Shop')),
body: const Center(
child: Text('Products go here'),
),
);
}
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Proyek
1Proyek: Daftar Tugas
Daftar Tugas: Daftar TugasDaftar Tugas: Tambahkan Tugas4Proyek: Pelacak Kebiasaan
Pelacak Kebiasaan: KebiasaanmuPelacak Kebiasaan: Pekan IniLatihan sendiri: Compiler Flutter online