Masukkan Password
06 Dart var vs dynamic | Difference between var & dynamic in dart
Video ini membahas perbedaan yang sangat penting antara var dan dynamic di Dart.
Kalau video sebelumnya kita sudah tahu bahwa keduanya bisa digunakan untuk membuat variable, sekarang fokusnya adalah:
Apa sebenarnya perbedaan
vardandynamic? Mengapavarlebih aman? Kapandynamicdibutuhkan?
Saya akan jelaskan dari konsep paling dasar, lalu masuk ke contoh error compile-time vs runtime, karena ini inti dari video.
1. Ingat kembali: var dan dynamic
Kita bisa membuat variable seperti ini:
var x = 10;
atau:
dynamic x = 10;
Sekilas terlihat hampir sama.
Tetapi perilakunya berbeda.
Perbedaan sederhananya:
var
β
Dart mencari tahu tipe variable
β
tipe menjadi relatif tetap
dynamic
β
Dart membiarkan variable bersifat dinamis
β
tipe value bisa berubah
Contoh:
var x = 10;
x = 20; // β
x = "Hello"; // β
Sedangkan:
dynamic x = 10;
x = 20; // β
x = "Hello"; // β
Nah, kenapa bisa begitu?
2. var Itu Bukan Sebuah Type
Ini poin pertama yang ditekankan video.
Ketika kita menulis:
var x = 10;
var bukan tipe data sebenarnya seperti:
int
String
double
bool
var adalah keyword yang meminta Dart melakukan type inference.
Contoh:
var x = 10;
Dart melihat:
10
β
int
Maka Dart mengetahui bahwa:
x β int
Jadi secara konsep:
var x = 10;
kurang lebih Dart mengetahui:
x adalah int
3. Apa Itu Type Inference?
Type inference adalah kemampuan Dart untuk menentukan tipe data berdasarkan nilai yang diberikan.
Misalnya:
var age = 20;
Dart melihat:
20
β
int
Maka:
age β int
Contoh lainnya:
var name = "Budi";
Dart mengetahui:
name β String
Dan:
var price = 10.5;
Dart mengetahui:
price β double
Jadi kita tidak harus selalu menulis:
int age = 20;
String name = "Budi";
double price = 10.5;
Kita bisa menulis:
var age = 20;
var name = "Budi";
var price = 10.5;
Dart akan melakukan inferensi.
4. dynamic Berbeda
Sekarang:
dynamic x = 10;
Di sini kita secara eksplisit mengatakan kepada Dart:
“
xadalah variable dynamic.”
dynamic merupakan type yang khusus dalam Dart.
Karena itu dynamic dapat digunakan dalam berbagai posisi yang membutuhkan tipe.
Misalnya secara konsep kita dapat mempunyai function:
dynamic test() {
return 10;
}
Artinya function tersebut memiliki return type dynamic.
Sedangkan:
var test() {
return 10;
}
tidak valid untuk digunakan sebagai return type seperti itu.
Kenapa?
Karena:
var
β
keyword untuk deklarasi variable + type inference
sedangkan:
dynamic
β
keyword + sebuah type yang bisa digunakan sebagai type
Ini salah satu perbedaan fundamental antara keduanya.
5. Analogi Sederhana
Bayangkan kita punya dua kotak.
Kotak var
Pertama kita masukkan angka:
var box = 10;
Dart berkata:
“Oh, isi kotak ini
int.”
ββββββββββββββββ
β box β
β type: int β
β value: 10 β
ββββββββββββββββ
Kemudian:
box = 20;
Boleh, karena 20 juga int.
Tetapi:
box = "Hello";
Tidak boleh, karena sekarang kita mencoba memasukkan String ke variable yang sudah diketahui sebagai int.
Kotak dynamic
dynamic box = 10;
Kotaknya lebih fleksibel:
ββββββββββββββββββ
β box β
β type: dynamic β
β value: 10 β
ββββββββββββββββββ
Kemudian:
box = "Hello";
Boleh.
Kemudian:
box = true;
Boleh.
Kemudian:
box = 20.5;
Boleh.
Jadi:
dynamic
β
βββ int
βββ String
βββ bool
βββ double
βββ ...
6. Perbedaan Paling Penting: Static Type Checking
Sekarang masuk ke inti video.
Dart memiliki mekanisme static analysis/type checking.
Secara sederhana, Dart berusaha menemukan kesalahan dari kode sebelum program dijalankan.
Misalnya:
var x = 10;
var y = "Hello";
print(x + y);
Dart melihat:
x β int
y β String
Kemudian:
int + String
tidak sesuai.
Dart bisa mengatakan:
“Ini operasi yang tidak valid.”
Sebelum program dijalankan.
Itulah yang disebut compile-time/static checking dalam konteks pembahasan video.
7. Contoh var dengan Operasi Salah
Perhatikan:
var x = 10;
var y = "Hello";
print(x + y);
Dart mengetahui:
x = int
y = String
Kemudian kita mencoba:
int + String
β Tidak valid.
Karena Dart sudah mengetahui tipe kedua variable tersebut.
Secara sederhana:
x + y
β β
β βββ String
βββββββ int
β
tidak cocok
β
ERROR terdeteksi
sebelum runtime
Ini keuntungan besar dari static type checking.
8. Sekarang Gunakan dynamic
Kita ubah:
dynamic x = 10;
dynamic y = "Hello";
print(x + y);
Sekarang Dart tidak melakukan pengecekan tipe dengan cara yang sama seperti pada variable yang tipenya sudah diketahui secara statis.
Akibatnya, kode tersebut bisa lolos dari analisis awal.
Tetapi ketika dijalankan, operasi:
10 + "Hello"
tidak valid.
Akhirnya program menghasilkan:
Runtime Exception
Jadi:
var
β
kesalahan bisa terdeteksi lebih awal
β
compile/static analysis error
Sedangkan:
dynamic
β
operasi bisa lolos static analysis
β
masalah baru diketahui ketika dijalankan
β
runtime error/exception
9. Compile-Time vs Runtime
Ini wajib kamu pahami karena akan sering muncul saat belajar programming.
Compile-time
Kesalahan ditemukan sebelum program berjalan.
Contoh:
var x = 10;
x = "Hello";
Dart sudah tahu:
x β int
Tetapi kita mencoba memberikan:
String
Maka Dart bisa memperingatkan/error sebelum kode dijalankan.
Runtime
Kesalahan terjadi ketika program sedang berjalan.
Contoh:
dynamic x = 10;
print(x.toUpperCase());
Program dapat melewati static analysis karena x adalah dynamic.
Tetapi saat runtime ternyata:
x = 10
dan int tidak memiliki method:
toUpperCase()
Maka terjadi exception saat program dijalankan.
10. Contoh toUpperCase()
Ini contoh yang sangat bagus dari video.
Kita punya:
var x = 10;
Kemudian:
x.toUpperCase();
toUpperCase() adalah method yang digunakan untuk String.
Contoh:
String name = "Budi";
print(name.toUpperCase());
Hasil:
BUDI
Tetapi x adalah:
int
Jadi:
var x = 10;
x.toUpperCase();
β Tidak valid.
Dart sudah mengetahui bahwa:
x β int
dan int tidak mempunyai method toUpperCase() yang sesuai.
11. Kalau Menggunakan dynamic
Sekarang:
dynamic x = 10;
x.toUpperCase();
Pada tahap static analysis, Dart tidak memperlakukan x seperti variable yang sudah diketahui bertipe int dengan cara yang sama.
Jadi kode tersebut dapat melewati pengecekan statis.
Tetapi ketika program dijalankan:
x
β
10
β
int
β
coba panggil toUpperCase()
β
β method tidak tersedia
β
Runtime Exception
Ini sangat penting:
dynamictidak membuat operasi yang salah menjadi benar.
dynamic hanya membuat Dart lebih longgar dalam melakukan pengecekan tipe secara statis.
12. Jadi dynamic Bukan “Tanpa Type”
Ini kesalahpahaman yang sering terjadi.
Jangan berpikir:
“
dynamicberarti variable tidak punya tipe.”
Lebih tepat:
dynamicmembuat variable dapat diperlakukan secara dinamis dan menunda sebagian pemeriksaan tipe hingga runtime.
Contoh:
dynamic x = 10;
Saat ini object/value yang dipegang x adalah:
10 β int
Kemudian:
x = "Hello";
Sekarang value yang dipegang:
"Hello" β String
Kemudian:
x = true;
Sekarang:
true β bool
13. Perbedaan Assignment var vs dynamic
Ini contoh paling jelas.
var
var x = 10;
x = 20; // β
x = 30; // β
x = "Hello"; // β
x = 10.5; // β
Kenapa?
Karena:
x pertama kali β int
Dan tipe x sudah diketahui.
dynamic
dynamic x = 10;
x = 20; // β
x = "Hello"; // β
x = 10.5; // β
x = true; // β
Karena x bersifat dynamic.
14. Perhatikan runtimeType
Video juga menggunakan sesuatu seperti:
x.runtimeType
Ini berguna untuk melihat tipe object/value yang sedang dipegang variable saat runtime.
Contoh:
dynamic x = 10;
print(x.runtimeType);
Output:
int
Kemudian:
x = "Hello";
print(x.runtimeType);
Output:
String
Kemudian:
x = 10.5;
print(x.runtimeType);
Output:
double
Jadi:
dynamic x = 10
β
runtimeType β int
x = "Hello"
β
runtimeType β String
x = 10.5
β
runtimeType β double
15. var Juga Bisa Menggunakan runtimeType
Misalnya:
var x = 10;
print(x.runtimeType);
Output:
int
Kemudian:
x = 20;
Tetap:
int
Karena x memang sudah diinfer sebagai int.
Kita bisa membayangkan:
var x = 10
β
x β int
β
20 masih int β β
String β β
double β β
16. Tabel Perbedaan var dan dynamic
Ini tabel yang sebaiknya kamu ingat:
| Aspek | var | dynamic |
|---|---|---|
| Keyword | β | β |
| Bisa membuat variable | β | β |
| Type inference | β | Tidak menjadi tujuan utamanya |
| Tipe variable relatif tetap setelah inference | β | β |
| Bisa menerima tipe berbeda | β | β |
| Static analysis lebih ketat | β | Lebih longgar |
| Kesalahan tipe lebih mungkin ditemukan lebih awal | β | β |
| Error bisa baru muncul saat runtime | Lebih kecil kemungkinannya | Lebih mungkin |
| Cocok untuk penggunaan umum | β | Hanya jika memang diperlukan |
17. Analogi Guru dan Murid
Supaya lebih mudah, bayangkan ada seorang guru.
var
Kamu memberikan sebuah kotak kepada guru:
var box = 10;
Guru melihat:
“Oh, ini kotak integer.”
Kemudian kamu masukkan:
20
Guru berkata:
“Boleh, masih integer.”
Tapi ketika kamu memasukkan:
"Hello"
Guru langsung berkata:
“Tidak boleh. Kotak ini sudah diketahui sebagai integer.”
dynamic
Kamu memberikan kotak:
dynamic box = 10;
Guru berkata:
“Oke, kotak ini dinamis.”
Kamu memasukkan:
20
Boleh.
"Hello"
Boleh.
true
Boleh.
Tetapi suatu saat kamu mencoba melakukan operasi yang tidak cocok:
"Hello" + operasi khusus integer
Barulah masalahnya muncul ketika program berjalan.
18. Kenapa var Lebih Disarankan?
Video mengatakan bahwa dokumentasi Dart merekomendasikan menggunakan var dibanding dynamic jika dynamic tidak benar-benar diperlukan.
Alasannya sederhana:
var mempertahankan manfaat static typing.
Contoh:
var name = "Budi";
Dart tahu:
name β String
Sehingga IDE/compiler bisa membantu kita:
- menemukan kesalahan lebih awal
- memberikan autocomplete yang lebih akurat
- mengetahui method apa yang tersedia
- membantu refactoring
- membuat kode lebih mudah dipahami
- mengurangi error runtime
Misalnya:
var name = "Budi";
name.toUpperCase();
IDE tahu name adalah String, sehingga bisa membantu memberikan autocomplete untuk method String.
19. Mengapa dynamic Tetap Ada?
Kalau dynamic berpotensi membuat error runtime, kenapa Dart menyediakan dynamic?
Karena ada situasi di mana kita memang belum mengetahui tipe data secara pasti pada saat compile-time.
Salah satu contoh yang disebut video adalah JSON.
Misalnya kita mendapatkan data dari server:
{
"name": "Budi",
"age": 20
}
Data dari luar program terkadang perlu diproses secara dinamis terlebih dahulu.
Dalam kasus seperti ini, dynamic bisa berguna.
Tetapi dalam aplikasi Flutter yang besar, biasanya kita berusaha mengubah data tersebut menjadi model/class dengan tipe yang jelas sesegera mungkin.
Misalnya konsepnya:
JSON
β
decode
β
data
β
Model/User class
β
User yang typed
Dengan begitu kita mendapatkan kembali manfaat type safety.
20. Jangan Mengartikan “Gunakan var Selalu”
Pernyataan:
“Gunakan
var, jangandynamic.”
terlalu sederhana.
Yang lebih tepat:
Gunakan tipe yang paling tepat dan sejelas mungkin. Gunakan
varketika type inference membuat kode tetap jelas. Gunakandynamicketika memang membutuhkan dynamic behavior.
Contoh:
String name = "Budi";
sangat jelas.
var name = "Budi";
juga jelas.
Tetapi:
dynamic name = "Budi";
biasanya tidak diperlukan jika kita sudah tahu bahwa name adalah String.
21. Hubungan dengan Type Annotation
Sebenarnya kita sekarang punya tiga pilihan yang sudah dipelajari:
Explicit type
int age = 20;
Kita mengatakan langsung:
age adalah int.
var
var age = 20;
Kita mengatakan:
Dart, tentukan tipe berdasarkan value.
Hasilnya:
age β int
dynamic
dynamic age = 20;
Kita mengatakan:
Variable ini bersifat dynamic.
Dan nantinya dapat menampung value dengan tipe berbeda.
22. Diagram Besar
Kalau diringkas:
VARIABLE
β
ββββββββββββ΄βββββββββββ
β β
var dynamic
β β
βΌ βΌ
Type inference Dynamic type
β β
βΌ βΌ
var x = 10 dynamic x = 10
β β
βΌ βΌ
x β int x β dynamic
β β
β βββ x = 20
β βββ x = "Hello"
β βββ x = true
β βββ x = 10.5
β
βββ x = 20 β
β
βββ x = "Hi" β
β
βββ x = true β
23. Contoh yang Sangat Penting
Perhatikan dua program berikut.
Program A β var
void main() {
var x = 10;
print(x + 20);
}
Dart tahu:
x β int
20 β int
Maka:
10 + 20
β
30
β Aman.
Program B β dynamic
void main() {
dynamic x = 10;
print(x + 20);
}
Ini juga bisa berjalan:
10 + 20
β
30
Tetapi sekarang static analyzer memiliki lebih sedikit informasi tentang x.
Kemudian kalau:
dynamic x = "Hello";
print(x + 20);
masalah baru muncul ketika operasi tersebut dijalankan.
24. Kesalahan Konsep yang Harus Dihindari
β “var berarti tipe datanya tidak diketahui.”
Tidak.
var justru menggunakan type inference.
var x = 10;
Dart mengetahui:
x β int
β “dynamic berarti tidak ada tipe.”
Tidak tepat.
dynamic adalah type khusus yang membuat pemeriksaan tipe lebih dinamis.
β “dynamic lebih bagus karena fleksibel.”
Belum tentu.
Fleksibilitas memiliki trade-off:
lebih fleksibel
β
lebih sedikit informasi tipe saat compile-time
β
lebih sedikit perlindungan static typing
β
lebih banyak potensi error runtime
β “var dan dynamic sama saja.”
Tidak.
Perbedaan utamanya adalah bagaimana Dart memperlakukan informasi tipe dan melakukan static checking.
25. Inti Video dalam Satu Contoh
Kalau kamu hanya ingin mengingat satu contoh dari video, ingat ini:
var x = 10;
x = 20; // β
x = "Hello"; // β
Karena:
var x = 10
β
type inference
β
x β int
Sedangkan:
dynamic x = 10;
x = 20; // β
x = "Hello"; // β
x = true; // β
Karena:
dynamic x
β
type dapat berubah
Dan ketika melakukan operasi yang tidak cocok:
dynamic x = 10;
x.toUpperCase();
bisa lolos dari static checking tetapi kemudian menghasilkan runtime error/exception, karena nilai sebenarnya adalah int.
26. Ringkasan Super Singkat
Pegang kalimat ini:
var= Dart menentukan tipe untuk kita, tetapi tipe hasilnya tetap terikat pada variable tersebut.
dynamic= Dart memberi kita fleksibilitas tipe dan mengurangi manfaat static type checking.
Contoh:
var x = 10;
berarti secara konsep:
x β int
Sedangkan:
dynamic x = 10;
berarti:
x β dynamic
value saat ini β int
dan nanti bisa:
x = "Hello";
sehingga:
value saat ini β String
π§ Cara mengingatnya
VAR
"Type-nya ditebak Dart"
β
lebih aman
lebih banyak static checking
tipe variable tetap setelah inference
DYNAMIC
"Type-nya dibuat dinamis"
β
lebih fleksibel
lebih sedikit static checking
lebih berpotensi error saat runtime
Rekomendasi praktis untuk belajar Flutter: biasakan menggunakan type annotation atau var terlebih dahulu. Jangan menggunakan dynamic hanya karena ingin menghindari error tipe. dynamic sebaiknya dipahami sebagai alat khusus ketika data atau API yang kita hadapi memang membutuhkan perilaku dinamis.