Masukkan Password
18 All Operators in Dart | Dart Operators | Dart Tutorial #17
Transcript ini membahas operator di Dart. Materinya cukup banyak, jadi saya akan pecah menjadi bagian-bagian kecil supaya mudah dipahami, lalu saya beri contoh sederhana dan kapan operator tersebut biasanya digunakan.
Catatan: Ada beberapa istilah di transcript yang terdengar salah karena kemungkinan hasil speech-to-text, misalnya “dark” → Dart, “state” → Set, “field sign” →
~/, dan “save navigation” → null-aware access (?.). Saya akan gunakan istilah Dart yang benar.
1. Apa itu Operator?
Operator adalah simbol yang memberi tahu program untuk melakukan suatu operasi.
Contoh:
int x = 10;
int y = 5;
int hasil = x + y;
Di sini:
x + y
x→ operandy→ operand+→ operator
Hasilnya:
15
Apa itu operand?
Operand adalah nilai atau variabel yang dikenai operator.
Contoh:
10 + 5
10→ operand+→ operator5→ operand
2. Operator Berdasarkan Jumlah Operand
Operator dibagi menjadi 3 berdasarkan jumlah operand yang dibutuhkan.
A. Unary operator
Membutuhkan 1 operand.
Contoh:
-x
Hanya ada satu operand, yaitu x.
Contoh lain:
!true
Operator ! hanya bekerja terhadap satu nilai.
B. Binary operator
Membutuhkan 2 operand.
Contoh:
x + y
Ada:
x + y
↑ ↑ ↑
operand operator operand
C. Ternary operator
Membutuhkan 3 bagian/operand.
Contohnya:
umur >= 18 ? "Dewasa" : "Anak-anak"
Ada tiga bagian:
- kondisi →
umur >= 18 - hasil jika benar →
"Dewasa" - hasil jika salah →
"Anak-anak"
3. Arithmetic Operators
Arithmetic operator digunakan untuk operasi matematika.
Operator yang penting:
| Operator | Arti |
|---|---|
+ | Penjumlahan |
- | Pengurangan |
* | Perkalian |
/ | Pembagian |
~/ | Pembagian integer |
% | Sisa pembagian/modulus |
Contoh:
int a = 10;
int b = 4;
print(a + b);
print(a - b);
print(a * b);
print(a / b);
print(a ~/ b);
print(a % b);
Hasil:
14
6
40
2.5
2
2
Mari kita bahas satu-satu.
+ Penjumlahan
10 + 4
Hasil:
14
- Pengurangan
10 - 4
Hasil:
6
* Perkalian
10 * 4
Hasil:
40
/ Pembagian
10 / 4
Hasil:
2.5
Di Dart, operator / menghasilkan double.
Jadi:
10 / 4
hasilnya:
2.5
~/ Integer Division
Kalau kita tidak ingin hasil berupa desimal, gunakan:
10 ~/ 4
Hasil:
2
Perhatikan:
10 / 4 // 2.5
10 ~/ 4 // 2
~/ mengambil hasil pembagian dalam bentuk integer.
% Modulus
Digunakan untuk mendapatkan sisa pembagian.
10 % 3
10 dibagi 3:
3 × 3 = 9
Sisanya:
1
Jadi:
print(10 % 3);
hasil:
1
Operator % sangat berguna misalnya untuk mengecek bilangan genap:
if (angka % 2 == 0) {
print("Genap");
}
Kenapa?
Karena bilangan genap jika dibagi 2 sisanya selalu 0.
4. Relational Operators
Relational operator digunakan untuk membandingkan dua nilai.
Hasilnya selalu:
true
atau:
false
Operatornya:
| Operator | Arti |
|---|---|
< | kurang dari |
<= | kurang dari atau sama dengan |
> | lebih dari |
>= | lebih dari atau sama dengan |
== | sama dengan |
!= | tidak sama dengan |
<
10 < 20
Artinya:
Apakah 10 lebih kecil dari 20?
Jawabannya:
true
>
10 > 20
Artinya:
Apakah 10 lebih besar dari 20?
Hasil:
false
<=
10 <= 10
Artinya:
Apakah 10 lebih kecil atau sama dengan 10?
Benar:
true
Karena sama dengan juga diperbolehkan.
>=
10 >= 10
Hasil:
true
==
Digunakan untuk mengecek apakah dua nilai sama.
10 == 10
Hasil:
true
Sedangkan:
10 == 5
hasil:
false
Jangan tertukar dengan =
Ini penting sekali.
x = 10;
Artinya:
masukkan nilai 10 ke
x.
Sedangkan:
x == 10
Artinya:
apakah
xsama dengan 10?
Jadi:
= → assignment
== → comparison
!=
Artinya tidak sama dengan.
10 != 5
Hasil:
true
Karena 10 memang tidak sama dengan 5.
10 != 10
Hasil:
false
5. Logical Operators
Logical operator digunakan untuk menggabungkan beberapa kondisi.
Ada tiga:
| Operator | Nama | Arti sederhana | ||
|---|---|---|---|---|
&& | AND | dan | ||
| ` | ` | OR | atau | |
! | NOT | kebalikan |
6. Logical AND &&
&& menghasilkan true hanya jika kedua kondisi benar.
Contoh:
10 > 5 && 20 > 15
Kondisi pertama:
10 > 5 → true
Kondisi kedua:
20 > 15 → true
Karena:
true && true
hasilnya:
true
Truth table
| A | B | A && B |
|---|---|---|
| true | true | true |
| true | false | false |
| false | true | false |
| false | false | false |
Cara gampang mengingat:
AND = semua harus benar.
Contoh dunia nyata:
Saya boleh masuk jika punya tiket DAN punya ID.
Kalau salah satu tidak punya:
false
7. Logical OR ||
|| menghasilkan true jika minimal salah satu kondisi benar.
Contoh:
10 > 50 || 5 < 10
Kondisi pertama:
false
Kondisi kedua:
true
Maka:
false || true
hasil:
true
Truth table:
| A | B | A || B | | —– | —– | —— | | true | true | true | | true | false | true | | false | true | true | | false | false | false |
Cara gampang:
OR = salah satu saja benar sudah cukup.
8. Logical NOT !
! membalik nilai boolean.
!true
menjadi:
false
Sedangkan:
!false
menjadi:
true
Contoh:
bool login = true;
print(!login);
Hasil:
false
Karena login awalnya true, kemudian dibalik menjadi false.
9. Assignment Operators
Assignment operator digunakan untuk memberikan nilai ke variabel.
Yang paling dasar:
=
Contoh:
int x = 10;
Artinya:
Simpan
10ke dalamx.
Shorthand Assignment
Dart juga memiliki bentuk singkat.
Misalnya:
int x = 10;
x += 5;
Artinya sama dengan:
x = x + 5;
Jadi:
10 + 5 = 15
Operator lainnya:
| Operator | Bentuk panjang |
|---|---|
+= | x = x + y |
-= | x = x - y |
*= | x = x * y |
/= | x = x / y |
~/= | x = x ~/ y |
%= | x = x % y |
Contoh:
int x = 10;
x += 5; // 15
x -= 3; // 12
x *= 2; // 24
10. Increment dan Decrement
Ada:
++
dan:
--
++
Menambahkan nilai sebesar 1.
int x = 10;
x++;
Sekarang:
x = 11
--
Mengurangi nilai sebesar 1.
int x = 10;
x--;
Sekarang:
x = 9
Yang menarik adalah pre dan post.
11. Post-Increment x++
Perhatikan:
int x = 10;
int y = x++;
Apa yang terjadi?
Urutannya:
Langkah 1
Nilai x diberikan terlebih dahulu:
y = 10
Langkah 2
Baru x dinaikkan:
x = 11
Jadi:
x = 11
y = 10
Cara mengingat:
Post = pakai dulu, naik belakangan.
12. Pre-Increment ++x
Sekarang:
int x = 10;
int y = ++x;
Urutannya:
Langkah 1
x dinaikkan dulu:
x = 11
Langkah 2
Nilai 11 diberikan ke y.
Hasil:
x = 11
y = 11
Cara mengingat:
Pre = naik dulu, pakai kemudian.
13. Pre-Decrement dan Post-Decrement
Sama persis, hanya nilainya dikurangi.
Pre-decrement
int x = 10;
int y = --x;
Hasil:
x = 9
y = 9
Karena:
kurangi dulu → baru gunakan.
Post-decrement
int x = 10;
int y = x--;
Hasil:
x = 9
y = 10
Karena:
gunakan dulu → baru kurangi.
14. Bitwise Operators
Ini bagian yang biasanya terasa lebih sulit.
Bitwise operator bekerja pada representasi binary dari angka.
Komputer pada dasarnya bekerja dengan bit:
0
1
Misalnya angka:
10
Dalam binary:
1010
Angka:
12
dalam binary:
1100
Bitwise operator akan membandingkan/memanipulasi bit-bit tersebut.
15. Bitwise AND &
Aturannya:
1 & 1 = 1
Selain itu:
0
Contoh:
10 = 1010
12 = 1100
Kemudian:
1010
1100
----
1000
1000 dalam desimal adalah:
8
Jadi:
10 & 12
hasilnya:
8
16. Bitwise OR |
Aturan:
Jika salah satu bit bernilai
1, hasilnya1.
Contoh:
1010
1100
----
1110
1110 dalam desimal:
14
Jadi:
10 | 12
hasilnya:
14
17. Bitwise XOR ^
XOR menghasilkan 1 jika kedua bit berbeda.
| A | B | A ^ B |
|---|---|---|
| 0 | 0 | 0 |
| 0 | 1 | 1 |
| 1 | 0 | 1 |
| 1 | 1 | 0 |
Contoh:
1010
1100
----
0110
0110 = 6.
Jadi:
10 ^ 12
hasil:
6
Cara mengingat XOR:
beda → 1, sama → 0
18. Bitwise NOT / Complement ~
Operator:
~
membalik bit:
0 → 1
1 → 0
Namun, ada satu hal penting: pada Dart, integer menggunakan representasi bertanda dengan two’s complement, sehingga hasil ~x tidak sesederhana sekadar “menulis semua bit 0 menjadi 1” pada representasi pendek seperti 1010.
Identitas praktis yang berguna:
~x == -x - 1
Misalnya:
~5
hasilnya:
-6
Jadi hati-hati dengan penjelasan binary sederhana di transcript.
19. Left Shift <<
Operator:
<<
menggeser bit ke kiri.
Contoh:
5 << 2
5 dalam binary:
101
Geser 2 posisi ke kiri:
10100
Binary 10100 = 20.
Jadi:
5 << 2
hasil:
20
Secara sederhana, untuk bilangan positif:
5 × 2² = 20
20. Right Shift >>
Kebalikannya.
20 >> 2
20 dalam binary:
10100
Geser dua posisi ke kanan:
101
101 = 5.
Jadi:
20 >> 2
hasil:
5
21. Conditional / Ternary Operator
Ini operator yang sangat sering digunakan di Flutter.
Bentuknya:
condition ? valueIfTrue : valueIfFalse
Contoh:
int umur = 20;
String status = umur >= 18 ? "Dewasa" : "Anak-anak";
Karena:
20 >= 18
adalah true, maka:
status = "Dewasa"
Bandingkan dengan if-else
Tanpa ternary:
String status;
if (umur >= 18) {
status = "Dewasa";
} else {
status = "Anak-anak";
}
Dengan ternary:
String status = umur >= 18 ? "Dewasa" : "Anak-anak";
Lebih pendek.
Cara membaca:
umur >= 18 ? "Dewasa" : "Anak-anak"
Baca:
Kalau
umur >= 18benar, gunakan"Dewasa", kalau salah gunakan"Anak-anak".
22. Type Test Operators
Digunakan untuk mengecek atau melakukan cast terhadap tipe data.
Ada:
is
is!
as
23. is
Untuk mengecek apakah sebuah nilai memiliki tipe tertentu.
Contoh:
var x = 10;
print(x is int);
Hasil:
true
Karena 10 adalah int.
Contoh:
print(x is String);
Hasil:
false
24. is!
Artinya:
apakah nilai ini bukan tipe tersebut?
Contoh:
var x = 10;
print(x is! String);
Hasil:
true
Karena x memang bukan String.
25. as
as digunakan untuk melakukan type cast.
Misalnya kita mempunyai:
Object value = "Hello";
Kita tahu sebenarnya value berisi String.
Kita bisa melakukan:
String text = value as String;
Sekarang Dart memperlakukan value sebagai String.
Penting
as bukan alat untuk mengubah isi nilai secara sembarang.
Misalnya:
int x = 10;
double y = x as double;
Ini bukan cara yang benar untuk mengubah int menjadi double.
Untuk konversi angka, gunakan misalnya:
double y = x.toDouble();
Hasil:
10.0
Jadi bedakan:
as → type cast
toDouble → konversi nilai
toInt → konversi nilai
26. Cascade Operator ..
Ini salah satu fitur Dart yang sangat khas.
Operator:
..
disebut cascade notation/operator.
Gunanya adalah melakukan beberapa operasi terhadap objek yang sama.
Misalnya ada class:
class Test {
void greet() {
print("Hello");
}
void message() {
print("Welcome");
}
}
Tanpa cascade:
var obj = Test();
obj.greet();
obj.message();
Dengan cascade:
var obj = Test()
..greet()
..message();
Artinya:
Buat objek
Test, kemudian panggilgreet(), lalumessage()pada objek yang sama.
27. Kenapa Cascade Berguna?
Bayangkan kita membuat object Flutter:
var paint = Paint()
..color = Colors.red
..strokeWidth = 5
..style = PaintingStyle.stroke;
Daripada:
var paint = Paint();
paint.color = Colors.red;
paint.strokeWidth = 5;
paint.style = PaintingStyle.stroke;
Cascade membuat kode menjadi lebih ringkas.
Intinya
obj
..method1()
..method2()
..property = value;
Semua dilakukan pada objek obj yang sama.
28. Spread Operator ...
Operator:
...
disebut spread operator.
Digunakan untuk memasukkan elemen dari collection ke collection lain.
Contoh:
List<int> list1 = [10, 20, 30];
List<int> list2 = [
5,
...list1,
40
];
Hasil:
[5, 10, 20, 30, 40]
...list1 berarti:
Ambil semua elemen dari
list1dan masukkan ke sini.
29. Null-Aware Spread ...?
Ada juga:
...?
Ini berguna ketika collection yang ingin kita spread mungkin null.
Misalnya:
List<int>? list1;
Nilainya null.
Kalau:
List<int> list2 = [
10,
...list1,
20,
];
akan bermasalah karena list1 null.
Dengan null-aware spread:
List<int> list2 = [
10,
...?list1,
20,
];
Kalau list1 null, bagian tersebut diabaikan.
Hasil:
[10, 20]
Kalau:
list1 = [30, 40];
maka:
[10, 30, 40, 20]
30. Null-Aware Operators
Bagian ini sangat penting di Dart/Flutter karena Flutter banyak berurusan dengan data yang bisa null.
Ada beberapa operator null-aware yang perlu dipahami.
31. ?? — If Null / Default Value
Bentuk:
value ?? defaultValue
Artinya:
Kalau
valuetidak null, gunakanvalue. Kalau null, gunakandefaultValue.
Contoh:
String? name;
String result = name ?? "Guest";
Karena:
name = null
maka:
result = "Guest"
Kalau:
String? name = "Budi";
String result = name ?? "Guest";
maka:
result = "Budi"
Cara mengingat
x ?? 0
Baca:
“Pakai x, tapi kalau x null, pakai 0.”
32. ??= — Assign Jika Null
Bentuk:
x ??= value;
Artinya:
Berikan
valuekexhanya jikaxmasih null.
Contoh:
String? name;
name ??= "Budi";
print(name);
Hasil:
Budi
Karena awalnya:
name = null
Tetapi:
String? name = "Andi";
name ??= "Budi";
Hasil tetap:
Andi
Karena name sudah mempunyai nilai.
Cara mengingat
??=
=
“Isi kalau masih kosong.”
33. ?. — Null-Aware Access
Operator:
?.
digunakan ketika kita ingin mengakses property/method tetapi object-nya mungkin null.
Contoh:
String? name = "Sam";
int? length = name?.length;
Karena name tidak null:
length = 3
Tetapi:
String? name = null;
int? length = name?.length;
Maka:
length = null
Tidak terjadi null dereference.
Bandingkan . dan ?.
Dengan:
name.length
Dart menganggap name harus tersedia.
Sedangkan:
name?.length
artinya:
Kalau
nameada, ambillength. Kalaunamenull, hasilnya null.
Ini sangat sering dipakai di Flutter.
34. Null-Shorting Cascade ?..
Untuk cascade yang object-nya mungkin null, Dart juga memiliki bentuk null-aware cascade.
Contoh konsepnya:
obj
?..method1()
..method2();
Maksudnya:
Kalau
objtidak null, jalankan cascade. Kalauobjnull, operasi cascade tidak dijalankan.
Misalnya secara konsep:
Test? obj;
obj
?..greet()
..message();
Kalau obj == null, method tidak dipanggil.
Ini berbeda dengan cascade biasa:
obj
..greet()
..message();
Jika obj null, akan terjadi masalah.
35. Member Access Operator .
Operator titik:
.
digunakan untuk mengakses property atau method suatu object.
Contoh:
String name = "Budi";
print(name.length);
length adalah property.
Contoh:
print(name.toUpperCase());
toUpperCase() adalah method.
Jadi:
object.property
object.method()
36. Function Call Operator ()
Kurung:
()
digunakan ketika kita memanggil function/method.
Contoh:
sayHello();
Artinya function sayHello dijalankan.
Kalau ada parameter:
print("Hello");
print dipanggil dengan argument "Hello".
37. Subscript Operator []
Operator:
[]
digunakan untuk mengakses elemen berdasarkan index pada collection seperti List.
Contoh:
List<String> names = [
"Andi",
"Budi",
"Citra"
];
print(names[0]);
Hasil:
Andi
Karena index dimulai dari 0.
index 0 → Andi
index 1 → Budi
index 2 → Citra
38. Ringkasan Semua Operator
Ini bagian yang sebaiknya kamu simpan sebagai catatan.
| Operator | Fungsi | ||
|---|---|---|---|
+ | tambah | ||
- | kurang | ||
* | kali | ||
/ | bagi → double | ||
~/ | pembagian integer | ||
% | sisa pembagian | ||
< | lebih kecil | ||
<= | lebih kecil/sama | ||
> | lebih besar | ||
>= | lebih besar/sama | ||
== | sama | ||
!= | tidak sama | ||
&& | AND | ||
| ` | ` | OR | |
! | NOT | ||
= | assignment | ||
+= | tambah lalu assign | ||
-= | kurang lalu assign | ||
*= | kali lalu assign | ||
/= | bagi lalu assign | ||
++ | tambah 1 | ||
-- | kurang 1 | ||
& | bitwise AND | ||
| | bitwise OR | ||
^ | bitwise XOR | ||
~ | bitwise complement | ||
<< | shift kiri | ||
>> | shift kanan | ||
? : | ternary | ||
is | cek tipe | ||
is! | cek bukan tipe | ||
as | type cast | ||
.. | cascade | ||
... | spread | ||
...? | null-aware spread | ||
?? | default jika null | ||
??= | assign jika null | ||
?. | akses jika tidak null | ||
?.. | null-aware cascade | ||
. | akses member | ||
() | panggil function | ||
[] | akses index/element |
39. Operator yang Paling Penting untuk Flutter
Tidak semua operator memiliki tingkat kepentingan yang sama ketika kamu baru belajar Flutter.
Kalau tujuanmu adalah cepat bisa membaca dan menulis kode Flutter, saya sarankan prioritaskan:
Level 1 — Wajib banget
=
+
-
*
/
==
!=
>
<
>=
<=
&&
||
!
Karena akan terus digunakan dalam kondisi dan logika program.
Level 2 — Sangat sering di Flutter
?
:
??
?.
??=
Contohnya:
String title = userName ?? "Guest";
atau:
print(user?.name);
atau:
String status = isLogin ? "Logout" : "Login";
Operator seperti ini sangat sering muncul di code Flutter.
Level 3 — Sangat berguna
..
...
...?
Terutama ketika bekerja dengan:
- object
List- widget Flutter
- collection
- konfigurasi object
Contoh Flutter:
Column(
children: [
const Text("Hello"),
...items.map((item) => Text(item)),
],
)
Level 4 — Pelajari setelah dasar kuat
&
|
^
~
<<
>>
Bitwise operator penting untuk kasus tertentu, tetapi bukan sesuatu yang perlu kamu kuasai dulu untuk mulai membuat aplikasi Flutter.
40. Cara Mengingat Operator yang Sering Membingungkan
Ada beberapa pasangan yang sering membuat pemula bingung.
= vs ==
x = 10;
masukkan nilai.
x == 10;
bandingkan apakah sama.
& vs &&
&
→ bitwise AND.
&&
→ logical AND.
Contoh:
5 & 3
bekerja pada bit.
Sedangkan:
age >= 18 && hasTicket
bekerja pada boolean/logika.
| vs ||
|
→ bitwise OR.
||
→ logical OR.
?? vs ??=
x ?? 10
kalau
xnull, gunakan 10.
Sedangkan:
x ??= 10
kalau
xnull, isi x dengan 10.
. vs ?.
user.name
akses
name, dengan asumsiusertidak null.
user?.name
akses
namehanya jikausertidak null.
x++ vs ++x
y = x++;
pakai nilai lama → kemudian tambah 1.
y = ++x;
tambah 1 dulu → kemudian pakai nilai baru.
41. Gambaran Besarnya
Kalau disederhanakan, operator Dart sebenarnya bisa kamu kelompokkan berdasarkan pertanyaan yang ingin kamu jawab:
"Hitung sesuatu?"
↓
+ - * / ~/ %
"Bandingkan sesuatu?"
↓
< <= > >= == !=
"Gabungkan kondisi?"
↓
&& || !
"Masukkan nilai?"
↓
= += -= *= /=
"Tambah/kurangi 1?"
↓
++ --
"Ambil keputusan singkat?"
↓
? :
"Cek tipe?"
↓
is is! as
"Bagaimana kalau null?"
↓
?? ??= ?. ?.. ...?
"Kerjakan banyak hal pada object?"
↓
..
"Gabungkan collection?"
↓
... ...?
"Akses property/method?"
↓
.
"Panggil function?"
↓
()
"Akses index?"
↓
[]
Yang paling penting untuk pemula
Jangan mencoba menghafalkan semuanya sekaligus. Kuasai dulu pola berikut:
// matematika
a + b
// perbandingan
a > b
// kondisi
a > b && c > d
// assignment
x = 10
// keputusan
String status = age >= 18 ? "Dewasa" : "Anak";
// null
String name = userName ?? "Guest";
// null-aware access
print(user?.name);
// cascade
object
..method1()
..method2();
// spread
[1, 2, ...list]
Kalau pola-pola tersebut sudah terasa natural, membaca kode Flutter akan jauh lebih mudah karena kamu tidak lagi melihat ??, ?., .., ..., ? :, dan && sebagai simbol-simbol aneh, tetapi langsung memahami apa yang sedang dilakukan oleh kode tersebut.