Situs ini dikemudikan dua tombol, seperti mesin pemiliknya. Membaca: j dan k menggulir, d dan u setengah layar, gg ke atas, G ke bawah, H dan L pindah jendela, ? membuka panduan. Spasi adalah kunci leader Neovim dan mengurus isi: Spasi lalu h beranda, r riset, p proyek, g gear, a tentang, / tag, atau Spasi lalu angka untuk melompat ke jendela bernomor itu. Home adalah prefix tmux dan mengurus jendela: Home lalu c membuka terminal, Home lalu & menutup jendela, Home lalu spasi ke jendela berikutnya. Saat fokus ada di papan ketik, h j k l memindahkan pilihan antar tombol dan Enter membukanya.

RisetR TentangA Gear — G untuk gear — papan ketik, terminal, editor, homelab.G
    ProyekP Tag — / seperti di vim: cari./
    ×
    Menu

    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.

    id en
    rss gh in