Ercode CLI adalah tool command-line yang membantu developer Flutter untuk membuat modul CRUD dengan cepat. Alih-alih mengetik ratusan baris kode secara manual, Anda cukup membuat file konfigurasi JSON sederhana, dan Ercode CLI akan men-generate semua kode yang diperlukan.
Untuk setiap modul, Ercode CLI akan membuat:
- ✅ Model: Class untuk data dengan serialisasi JSON
- ✅ Repository: Class untuk komunikasi dengan API
- ✅ List View: Halaman untuk menampilkan daftar data
- ✅ Add/Edit View: Halaman form untuk tambah/edit data
- ✅ Detail View: Halaman untuk melihat detail data
- ✅ Controllers: Logic untuk mengatur state setiap halaman
- ⚡ Cepat: Generate modul lengkap dalam hitungan detik
- 🎯 Konsisten: Struktur kode yang seragam di seluruh project
- 🐛 Minim Bug: Template sudah teruji
- 📚 Best Practice: Mengikuti arsitektur yang baik
- 🔄 Reusable: Widget dan helper yang bisa dipakai ulang
Buka terminal dan jalankan:
# Menggunakan Dart
dart pub global activate ercode_cli
# ATAU menggunakan Flutter
flutter pub global activate ercode_cliercodeJika berhasil, akan muncul:
ercode
init to init ercode generator
generate <folder/generator.json> to generate code
Jika command ercode tidak ditemukan, tambahkan ke PATH:
macOS/Linux:
export PATH="$PATH":"$HOME/.pub-cache/bin"Tambahkan baris di atas ke ~/.bashrc atau ~/.zshrc
Windows:
Tambahkan %USERPROFILE%\AppData\Local\Pub\Cache\bin ke Environment Variables
Setelah menggunakan Ercode CLI, struktur project Anda akan seperti ini:
my_app/
├── lib/
│ ├── helpers/ # Fungsi-fungsi pembantu
│ ├── models/ # Model global
│ ├── widgets/ # Widget reusable
│ └── modules/ # Modul-modul yang digenerate
│ ├── book/
│ │ ├── data/
│ │ ├── controllers/
│ │ └── views/
│ ├── user/
│ └── product/
└── generator/ # Folder untuk simpan config JSON
├── book.json
├── user.json
└── product.json
JSON Config → Ercode CLI → Generated Code → Flutter App
- Anda buat file JSON yang mendefinisikan struktur modul
- Ercode CLI membaca JSON tersebut
- Ercode CLI men-generate kode berdasarkan template
- Anda tinggal gunakan kode yang sudah di-generate
Mari kita buat aplikasi sederhana untuk mengelola daftar buku.
flutter create my_library_app
cd my_library_appercode initProses ini akan:
- Install packages yang diperlukan
- Membuat folder
helpers/,widgets/,models/ - Generate helper files
- Modifikasi
main.dart
Proses ini memakan waktu beberapa menit. Tunggu sampai selesai!
Edit file lib/helpers/constants.dart:
const baseUrl = 'https://api.example.com/api';
const apiToken = ''; // Kosongkan jika tidak pakai tokenCatatan: Untuk tutorial ini, Anda bisa pakai API dummy atau mock API
mkdir generatorBuat file generator/book.json:
{
"name": "book",
"fields": [
{
"name": "id",
"type": "int",
"primary": true,
"hidden": true
},
{
"name": "title",
"type": "String",
"list": true
},
{
"name": "author",
"type": "String",
"list": true
},
{
"name": "year",
"type": "int",
"list": true
},
{
"name": "description",
"type": "String"
}
]
}Penjelasan:
"name": "book"→ Nama modul"primary": true→ Ini adalah ID/primary key"hidden": true→ Tidak ditampilkan di form (karena auto-generated dari server)"list": true→ Field ini ditampilkan di halaman list
ercode generate generator/book.jsonOutput:
File model lib/modules/book/data/book.dart created
File repo lib/modules/book/data/book_repository.dart created
File controller : lib/modules/book/controllers/book_controller.dart created
File view: lib/modules/book/views/book_view.dart created
...
flutter pub getEdit lib/main.dart, ubah home:
import 'package:my_library_app/modules/book/views/book_view.dart';
// ...
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(
navigatorKey: Get.navigatorKey,
builder: EasyLoading.init(),
home: BookView(), // Tambahkan ini
);
}
}flutter runSelamat! Anda sudah punya aplikasi dengan fitur:
- ✅ List buku
- ✅ Tambah buku baru
- ✅ Edit buku
- ✅ Hapus buku
- ✅ Lihat detail buku
Buat generator/product.json:
{
"name": "product",
"api": "products",
"fields": [
{
"name": "id",
"type": "int",
"primary": true,
"hidden": true
},
{
"name": "image",
"type": "String",
"input": "image",
"list": true
},
{
"name": "name",
"type": "String",
"list": true
},
{
"name": "price",
"type": "int",
"list": true
},
{
"name": "stock",
"type": "int",
"list": true
},
{
"name": "description",
"type": "String"
},
{
"name": "category",
"type": "String"
}
]
}Perbedaan dari sebelumnya:
"input": "image"→ Field ini adalah upload gambar"api": "products"→ Custom endpoint API
ercode generate generator/product.jsonFile yang di-generate akan otomatis handle:
- Image picker
- Image upload ke server (multipart form)
- Image preview di list
- Image crop (jika diperlukan)
Kadang Anda hanya butuh model tanpa view.
Buat generator/category.json:
{
"name": "category",
"only": ["model", "repository"],
"fields": [
{
"name": "id",
"type": "int",
"primary": true
},
{
"name": "name",
"type": "String"
},
{
"name": "icon",
"type": "String"
}
]
}Key point:
"only": ["model", "repository"]→ Hanya generate model dan repository
ercode generate generator/category.jsonHanya akan membuat:
lib/modules/category/data/category.dartlib/modules/category/data/category_repository.dart
Tidak membuat views dan controllers!
Modul yang dibutuhkan:
- Product (dengan gambar)
- Category
- Order
- Customer
File JSON:
{
"name": "product",
"fields": [
{"name": "id", "type": "int", "primary": true, "hidden": true},
{"name": "image", "input": "image", "list": true},
{"name": "name", "list": true},
{"name": "price", "type": "int", "list": true},
{"name": "stock", "type": "int", "list": true},
{"name": "description"},
{"name": "category_id", "type": "int", "hidden": true}
]
}{
"name": "category",
"only": ["model", "repository"],
"fields": [
{"name": "id", "type": "int", "primary": true},
{"name": "name"}
]
}{
"name": "order",
"fields": [
{"name": "id", "type": "int", "primary": true, "hidden": true},
{"name": "customer_name", "list": true},
{"name": "total_price", "type": "int", "list": true},
{"name": "status", "list": true},
{"name": "order_date", "list": true},
{"name": "shipping_address"}
]
}Generate semua:
ercode generate generator/product.json
ercode generate generator/category.json
ercode generate generator/order.jsonModul yang dibutuhkan:
- Post (artikel blog)
- Author
- Comment
{
"name": "post",
"fields": [
{"name": "id", "type": "int", "primary": true, "hidden": true},
{"name": "featured_image", "input": "image", "list": true},
{"name": "title", "list": true},
{"name": "slug", "hidden": true},
{"name": "content"},
{"name": "excerpt", "list": true},
{"name": "author_name", "list": true},
{"name": "published_at", "list": true},
{"name": "is_published", "type": "bool"}
]
}{
"name": "item",
"fields": [
{"name": "id", "type": "int", "primary": true, "hidden": true},
{"name": "photo", "input": "image", "list": true},
{"name": "code", "list": true},
{"name": "name", "list": true},
{"name": "quantity", "type": "int", "list": true},
{"name": "unit"},
{"name": "location"},
{"name": "last_restock"}
]
}Buat struktur folder untuk config JSON:
generator/
├── modules/
│ ├── product.json
│ ├── category.json
│ └── user.json
└── backups/
└── old_configs/
✅ Good:
{"name": "product"}
{"name": "user_profile"}
{"name": "order_item"}❌ Bad:
{"name": "Product"}
{"name": "user profile"}
{"name": "orderItem"}Selalu buat field ID seperti ini:
{
"name": "id",
"type": "int",
"primary": true,
"hidden": true
}Pilih 3-5 field penting untuk ditampilkan di list:
// GOOD - Ringkas dan informatif
{"name": "title", "list": true},
{"name": "author", "list": true},
{"name": "date", "list": true}
// BAD - Terlalu banyak
{"name": "field1", "list": true},
{"name": "field2", "list": true},
...
{"name": "field10", "list": true}Tip 5: Hidden Fields
Gunakan hidden: true untuk field yang:
- Auto-generated server (id, created_at, etc)
- Internal use only
- Tidak perlu input user
{
"name": "created_by",
"type": "int",
"hidden": true
}Jika endpoint API berbeda dengan nama modul:
{
"name": "user_profile",
"api": "users",
"fields": [...]
}Untuk replace file yang sudah ada:
ercode generate generator/book.json forceHati-hati! Ini akan menimpa semua modifikasi manual!
Sebelum pakai force, backup dulu:
# Backup folder modules
cp -r lib/modules lib/modules_backup
# Atau backup specific module
cp -r lib/modules/book lib/modules/book_backupJika Anda ingin re-generate setiap kali, tambahkan ke .gitignore:
lib/modules/*/
Tapi commit file JSON config:
!generator/
ercode generate generator/book.json
dart format lib/A: Bisa! Tapi jika Anda run generate lagi dengan flag force, modifikasi Anda akan hilang. Solusinya:
- Extend class yang di-generate
- Atau jangan pakai flag
force
A: Anda bisa modifikasi template di folder lib/templates/. Atau modifikasi kode hasil generate sesuai kebutuhan.
A: Default-nya untuk REST API. Untuk GraphQL, Anda perlu modifikasi template repository.
A: File sudah ada. Pilihan:
- Hapus manual
- Pakai flag
force:ercode generate config.json force
A: Run:
flutter pub get
dart fix --applyA: Ercode CLI fokus ke basic CRUD. Untuk relasi, Anda perlu custom manual di kode yang di-generate.
A: Default menggunakan StatefulWidget. Untuk state management lain, modifikasi template controller.
A: Tidak ada limit, tapi untuk UX yang baik, maksimal 10-15 field per form.
A: Kode yang di-generate compatible dengan Flutter web/desktop, tapi beberapa widget (image_picker) mungkin perlu adjustment.
A:
- Pastikan internet stabil
- Cek Flutter SDK sudah terinstall
- Run
flutter doctor
A:
dart pub global activate ercode_cliAtau force update:
dart pub global activate ercode_cli --forceA: Buka issue di GitHub: https://github.com/xrb21/ercode_cli/issues
Solution:
- Cek instalasi:
dart pub global list
- Tambahkan ke PATH (lihat bagian Instalasi)
- Restart terminal
Solution:
- Cek koneksi internet
- Coba manual install dependency:
flutter pub add dio flutter pub add validators # dst...
Solution: Cek:
- Path JSON benar
- Format JSON valid (gunakan JSON validator online)
- Field
nameada dan tidak kosong
Solution:
- Cek
baseUrldiconstants.dart - Test API dengan Postman/curl
- Cek network permission di AndroidManifest.xml
- Enable logging di
api.dart
Solution:
- Cek permission di AndroidManifest.xml:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/> <uses-permission android:name="android.permission.CAMERA"/>
- Request permission di runtime (Android 6+)
Solution:
- Cek API response format (lihat dokumentasi)
- Cek console untuk error message
- Pastikan ada field dengan
"list": true
Selamat! Anda sudah menguasai Ercode CLI.
Untuk dokumentasi lengkap, lihat:
- DOCUMENTATION.md - Dokumentasi lengkap
- QUICK_REFERENCE.md - Referensi cepat
Happy Coding! 🚀
Dibuat dengan ❤️ untuk Flutter developers Indonesia