busgo: Alur Pemesanan Tiket Bus di Flutter
Prototipe UI pemesanan tiket bus — cari jadwal, pilih bus, pilih kursi, isi data penumpang, bayar, tiket. Flutter dengan Riverpod dan go_router, tanpa backend.
busgo adalah alur pemesanan tiket bus yang saya bangun untuk melatih satu hal spesifik: alur berlangkah banyak di Flutter tanpa membuat setiap layar tahu langkah berikutnya.
Isinya benar-benar hanya alur itu — tidak ada klien HTTP di pubspec.yaml, jadi datanya lokal semua. Yang diuji di sini adalah navigasi dan bentuk state-nya, bukan integrasi.
Alur
login → home (form pencarian)
→ select_bus_page
→ select_seat_sheet
→ passengger_form_sheet
→ waiting_payment
→ ticket → list_booking
Tiga langkah di tengah tidak berupa halaman penuh, melainkan bottom sheet (select_seat_sheet, passengger_form_sheet, ditambah bottom_sheet_selector dan bottom_sheet_date_selector yang dipakai bersama). Alasannya praktis: memilih kursi lalu berubah pikiran itu wajar, dan menutup sheet terasa jauh lebih murah daripada menekan tombol kembali di halaman penuh.
Rute dan state
Navigasi ditangani go_router lewat satu lib/router/app_router.dart, jadi semua rute terbaca di satu tempat dan tidak ada layar yang memanggil Navigator.push ke layar lain secara langsung. State-nya Riverpod (flutter_riverpod + hooks_riverpod), dengan ProviderScope dibungkus di main.dart yang isinya hanya tiga baris:
void main() {
runApp(const ProviderScope(child: BusGoApp()));
}
Struktur foldernya per fitur, bukan per jenis file:
lib/features/{auth,home,booking,payment,profile}
lib/shared/widgets # bottom navigation + sheet yang dipakai lintas fitur
lib/router/app_router.dart
Status
Prototipe UI. Tidak ada backend, tidak ada pembayaran sungguhan — waiting_payment hanya menahan layar. Kalau nanti disambungkan ke API, lapisan yang perlu ditambah adalah repository di bawah provider; layar-layarnya tidak perlu tahu.