Membuat Halaman Data Kelompok Belajat Dengan Flatter Di Zapp.Run
Membuat Halaman Data Kelompok Belajat Dengan Flatter Di Zapp.Run
Membuat Halaman Data Kelompok Belajar dengan Flutter di Zapp.run
Flutter adalah framework yang sangat populer untuk membuat aplikasi mobile cross-platform (Android & iOS). Kali ini kita akan belajar membuat satu halaman aplikasi yang menampilkan data kelompok belajar dengan foto anggota, detail informasi (nama, no absen, alamat, kelas, hobi), serta tombol di bagian bawah yang memunculkan popup sederhana.
Struktur Halaman yang Akan Dibuat
Bagian atas → Judul "Wededen Squad".
Bagian isi → Daftar anggota kelompok dengan foto, nama, no absen, alamat. Jika salah satu anggota ditekan, akan terbuka halaman detail berisi informasi lebih lengkap.
Bagian bawah → Tombol "Awas Meledug". Jika ditekan, akan muncul popup dengan pesan salam.
Persiapan di Zapp.run
Masuk ke Zapp.run.
Buat project Flutter baru.
Simpan foto anggota kelompok di folder assets/ pada project.
Tambahkan path assets di file pubspec.yaml. Contoh:
flutter:
assets:
- assets/Azka.jpg
- assets/Isa.jpg
- assets/RianR.jpg
- assets/Dara.jpg
- assets/Yuni.jpg
Full Kode main.dart
Berikut adalah kode lengkap main.dart yang bisa langsung dijalankan di Zapp.run:
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(
title: 'Kelompok Belajar',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: const KelompokPage(),
debugShowCheckedModeBanner: false,
);
}
}
class KelompokPage extends StatelessWidget {
const KelompokPage({super.key});
final List<Map<String, String>> anggota = const [
{
"nama": "Azka Yaqiz",
"absen": "02",
"alamat": "Cimaragas",
"kelas": "XI RPL 1",
"hobi": "Jogging",
"foto": "assets/Azka.jpg",
},
{
"nama": "Isa",
"absen": "13",
"alamat": "Lembur balong",
"kelas": "XI RPL 1",
"hobi": "Play game",
"foto": "assets/Isa.jpg",
},
{
"nama": "Rian Rama R",
"absen": "26",
"alamat": "Cisaga",
"kelas": "XI RPL 1",
"hobi": "Bernyanyi",
"foto": "assets/RianR.jpg",
},
{
"nama": "Dara Tri Y",
"absen": "04",
"alamat": "Jajawar",
"kelas": "XI RPL 1",
"hobi": "Badminton",
"foto": "assets/Dara.jpg",
},
{
"nama": "Yuniyasih",
"absen": "34",
"alamat": "Sumanding",
"kelas": "XI RPL 1",
"hobi": "Ngoding",
"foto": "assets/Yuni.jpg",
},
];
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text("Wededen Squad"),
centerTitle: true,
),
body: Column(
children: [
Expanded(
child: ListView.builder(
itemCount: anggota.length,
itemBuilder: (context, index) {
final item = anggota[index];
return GestureDetector(
onTap: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (_) => DetailPage(data: item),
),
);
},
child: Container(
margin: const EdgeInsets.symmetric(horizontal: 16, vertical: 8),
decoration: BoxDecoration(
gradient: LinearGradient(
colors: [Colors.blue.shade100, Colors.white],
begin: Alignment.topLeft,
end: Alignment.bottomRight,
),
borderRadius: BorderRadius.circular(20),
boxShadow: [
BoxShadow(
color: Colors.grey.withOpacity(0.3),
blurRadius: 6,
offset: const Offset(2, 4),
),
],
),
child: ListTile(
contentPadding: const EdgeInsets.all(16),
leading: Hero(
tag: item["nama"]!,
child: CircleAvatar(
radius: 30,
backgroundImage: AssetImage(item["foto"]!),
),
),
title: Text(
"${item["nama"]} (No. ${item["absen"]})",
style: const TextStyle(fontWeight: FontWeight.bold),
),
subtitle: Row(
children: [
const Icon(Icons.location_on, size: 16, color: Colors.grey),
const SizedBox(width: 4),
Text(item["alamat"]!),
],
),
trailing: const Icon(Icons.arrow_forward_ios, size: 16),
),
),
);
},
),
),
Padding(
padding: const EdgeInsets.all(16.0),
child: SizedBox(
width: double.infinity,
child: ElevatedButton(
onPressed: () {
showDialog(
context: context,
builder: (context) => AlertDialog(
title: const Text("Salam"),
content: const Text("Wededen"),
actions: [
TextButton(
onPressed: () => Navigator.pop(context),
child: const Text("OK"),
)
],
),
);
},
child: const Text("Awas Meledug"),
),
),
)
],
),
);
}
}
class DetailPage extends StatelessWidget {
final Map<String, String> data;
const DetailPage({super.key, required this.data});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(data["nama"]!),
),
body: Container(
width: double.infinity,
decoration: BoxDecoration(
gradient: LinearGradient(
colors: [Colors.blue.shade50, Colors.white],
begin: Alignment.topCenter,
end: Alignment.bottomCenter,
),
),
padding: const EdgeInsets.all(24),
child: Column(
children: [
Hero(
tag: data["nama"]!,
child: CircleAvatar(
radius: 60,
backgroundImage: AssetImage(data["foto"]!),
),
),
const SizedBox(height: 20),
Text(
data["nama"]!,
style: const TextStyle(fontSize: 24, fontWeight: FontWeight.bold),
),
const SizedBox(height: 8),
Text("Absen: ${data["absen"]}"),
const Divider(height: 32),
ListTile(
leading: const Icon(Icons.class_),
title: const Text("Kelas"),
subtitle: Text(data["kelas"]!),
),
ListTile(
leading: const Icon(Icons.sports_esports),
title: const Text("Hobi"),
subtitle: Text(data["hobi"]!),
),
ListTile(
leading: const Icon(Icons.home),
title: const Text("Alamat"),
subtitle: Text(data["alamat"]!),
),
],
),
),
);
}
}
Hasil Tampilan
Daftar anggota tampil dalam card bergaya gradient dengan foto profil bulat.
Jika ditekan, akan terbuka halaman DetailPage berisi informasi lebih lengkap (kelas, hobi, alamat).
Tombol "Awas Meledug" di bawah layar akan menampilkan popup dengan pesan salam.
Penutup
Dengan kode ini, kita sudah bisa membuat aplikasi Flutter sederhana untuk menampilkan data kelompok belajar dengan fitur halaman detail. Kalian bisa mengembangkan lebih lanjut, misalnya menambahkan animasi, warna tema berbeda, atau menambah anggota kelompok baru.
Komentar
Posting Komentar