Masukkan Password
12 List methods & properties | Learning methods of List class | Dart tutorial #11
Teks yang kamu kirim membahas List di Dart, khususnya properti dan method yang sering dipakai dalam Flutter. Aku akan menjelaskannya dari dasar dengan bahasa yang lebih sederhana, sambil memperbaiki beberapa istilah yang salah karena hasil transkripsinya cukup banyak typo.
1. Apa itu List di Dart?
List adalah kumpulan data yang disimpan secara berurutan dan setiap data memiliki index.
Contoh:
List<String> animals = ['Cat', 'Dog', 'Tiger', 'Monkey'];
Posisinya:
Index: 0 1 2 3
↓ ↓ ↓ ↓
Cat Dog Tiger Monkey
Ingat:
Index List dimulai dari 0, bukan 1.
Jadi:
animals[0] // Cat
animals[1] // Dog
animals[2] // Tiger
animals[3] // Monkey
2. Properti penting pada List
A. length
Digunakan untuk mengetahui jumlah elemen di dalam List.
List<String> animals = ['Cat', 'Dog', 'Tiger', 'Monkey'];
print(animals.length);
Hasil:
4
Karena ada 4 elemen.
B. first
Mengambil elemen pertama.
print(animals.first);
Hasil:
Cat
Sama seperti:
animals[0]
C. last
Mengambil elemen terakhir.
print(animals.last);
Hasil:
Monkey
Kalau jumlah datanya berubah, last tetap otomatis mengambil elemen paling akhir.
D. isEmpty
Untuk mengecek apakah List kosong.
List<String> animals = [];
print(animals.isEmpty);
Hasil:
true
Kalau:
List<String> animals = ['Cat', 'Dog'];
print(animals.isEmpty);
Hasil:
false
Jadi:
isEmpty == true
berarti List kosong.
E. isNotEmpty
Kebalikan dari isEmpty.
List<String> animals = ['Cat', 'Dog'];
print(animals.isNotEmpty);
Hasil:
true
Artinya List mempunyai data.
3. reversed
reversed digunakan untuk mendapatkan urutan List secara terbalik.
List<String> animals = ['Cat', 'Dog', 'Tiger'];
print(animals.reversed);
Hasilnya secara konsep:
Tiger, Dog, Cat
Penting: reversed tidak mengubah List asli.
print(animals);
Tetap:
[Cat, Dog, Tiger]
Kalau kita ingin hasilnya benar-benar berupa List, biasanya gunakan:
List<String> reversedAnimals = animals.reversed.toList();
print(reversedAnimals);
Hasil:
[Tiger, Dog, Cat]
Kenapa ada .toList()?
Karena beberapa operasi seperti reversed, where, dan map menghasilkan Iterable, bukan List langsung.
Jadi:
.toList()
digunakan untuk mengubah Iterable menjadi List.
4. Menambahkan data: add()
add() digunakan untuk menambahkan satu elemen ke bagian paling belakang List.
List<String> animals = ['Cat', 'Dog', 'Tiger'];
animals.add('Monkey');
print(animals);
Hasil:
[Cat, Dog, Tiger, Monkey]
Jadi:
add()
➡️ selalu menambahkan data di akhir.
5. insert()
Kalau kita ingin memasukkan data ke posisi tertentu, gunakan insert().
List<String> animals = ['Cat', 'Dog', 'Tiger'];
animals.insert(2, 'Horse');
print(animals);
Sebelumnya:
Index 0 = Cat
Index 1 = Dog
Index 2 = Tiger
Setelah:
Index 0 = Cat
Index 1 = Dog
Index 2 = Horse
Index 3 = Tiger
Jadi:
insert(index, value)
Contoh:
animals.insert(2, 'Horse');
Artinya:
Masukkan
Horseke index2.
Elemen yang sebelumnya berada di index tersebut akan bergeser ke kanan.
6. addAll()
Kalau add() untuk menambahkan satu data, maka addAll() digunakan untuk menambahkan banyak data sekaligus.
Contoh:
List<String> animals1 = ['Cat', 'Dog', 'Tiger'];
List<String> animals2 = ['Lion', 'Monkey'];
animals2.addAll(animals1);
print(animals2);
Hasil:
[Lion, Monkey, Cat, Dog, Tiger]
Jadi semua isi animals1 ditambahkan ke akhir animals2.
7. insertAll()
Kalau ingin memasukkan banyak data ke posisi tertentu:
List<String> animals1 = ['Cat', 'Dog', 'Tiger'];
List<String> animals2 = ['Rat', 'Frog', 'Bird'];
animals2.insertAll(1, animals1);
print(animals2);
Hasil:
[Rat, Cat, Dog, Tiger, Frog, Bird]
Perhatikan:
insertAll(1, animals1)
Artinya semua data animals1 dimasukkan mulai dari index 1.
8. Menghapus data
Ada beberapa method untuk menghapus data.
A. removeAt()
Menghapus berdasarkan index.
List<String> fruits = [
'Mango',
'Apple',
'Lemon',
'Orange',
'Kiwi'
];
fruits.removeAt(1);
print(fruits);
Index 1 adalah Apple.
Hasil:
[Mango, Lemon, Orange, Kiwi]
Hati-hati
Kalau index tidak tersedia:
fruits.removeAt(100);
akan menghasilkan RangeError.
9. remove()
Kalau ingin menghapus berdasarkan nilai, gunakan remove().
fruits.remove('Orange');
Misalnya:
List<String> fruits = [
'Mango',
'Apple',
'Lemon',
'Orange',
'Kiwi'
];
bool result = fruits.remove('Orange');
print(result);
print(fruits);
Hasil:
true
[Mango, Apple, Lemon, Kiwi]
remove() mengembalikan bool.
Kalau data ditemukan dan berhasil dihapus:
true
Kalau tidak ditemukan:
false
Misalnya:
print(fruits.remove('Banana'));
Hasil:
false
10. removeLast()
Menghapus elemen terakhir.
List<String> fruits = [
'Mango',
'Apple',
'Lemon',
'Orange',
'Kiwi'
];
fruits.removeLast();
print(fruits);
Hasil:
[Mango, Apple, Lemon, Orange]
Kiwi dihapus karena dia elemen terakhir.
11. clear()
Menghapus semua elemen.
fruits.clear();
print(fruits);
Hasil:
[]
List-nya masih ada, tetapi isinya kosong.
12. removeRange()
Digunakan untuk menghapus data dalam rentang tertentu.
Sintaks:
list.removeRange(start, end);
Penting: end tidak ikut dihapus.
Contoh:
List<String> fruits = [
'Mango', // 0
'Apple', // 1
'Lemon', // 2
'Orange', // 3
'Kiwi' // 4
];
fruits.removeRange(1, 4);
Yang dihapus:
index 1 → Apple
index 2 → Lemon
index 3 → Orange
Index 4 tidak ikut dihapus.
Hasil:
[Mango, Kiwi]
Cara mudah mengingat:
removeRange(1, 4)→ hapus index 1 sampai 3.
13. removeWhere()
Ini sangat penting dalam Flutter.
removeWhere() digunakan untuk menghapus semua data yang memenuhi kondisi tertentu.
Contoh:
List<String> fruits = [
'Mango',
'Apple',
'Lemon',
'Orange',
'Kiwi'
];
fruits.removeWhere((fruit) => fruit.contains('o'));
print(fruits);
Kita meminta:
Hapus semua buah yang memiliki huruf
o.
Yang memiliki o:
Mango
Lemon
Orange
Hasil:
[Apple, Kiwi]
Kenapa ada (fruit) => ...?
Itu adalah function.
Secara sederhana:
(fruit) => fruit.contains('o')
berarti:
Untuk setiap
fruit, cek apakah mengandung hurufo.
Kalau hasilnya true, data tersebut dihapus.
14. retainWhere()
Kalau removeWhere() digunakan untuk menghapus yang memenuhi kondisi, retainWhere() kebalikannya.
retainWhere() berarti:
Pertahankan hanya data yang memenuhi kondisi.
Contoh:
List<String> fruits = [
'Mango',
'Apple',
'Lemon',
'Orange',
'Kiwi'
];
fruits.retainWhere((fruit) => fruit.contains('a'));
print(fruits);
Yang mempunyai huruf a:
Mango
Apple
Orange
Maka hasilnya:
[Mango, Apple, Orange]
Cara mudah membedakan:
removeWhere → buang yang true
retainWhere → simpan yang true
15. indexOf()
Digunakan untuk mencari index pertama dari suatu nilai.
Contoh:
List<int> numbers = [10, 20, 30, 20, 40, 50, 20];
print(numbers.indexOf(20));
Hasil:
1
Karena 20 pertama ditemukan di index 1.
16. lastIndexOf()
Digunakan untuk mencari index terakhir dari suatu nilai.
print(numbers.lastIndexOf(20));
Hasil:
6
Karena 20 terakhir terdapat di index 6.
17. sort()
sort() digunakan untuk mengurutkan data.
Contoh:
List<int> numbers = [50, 10, 40, 20, 30];
numbers.sort();
print(numbers);
Hasil:
[10, 20, 30, 40, 50]
Secara default, angka diurutkan dari kecil ke besar.
18. Sorting descending
Kalau ingin dari besar ke kecil:
numbers.sort((a, b) => b.compareTo(a));
Hasil:
[50, 40, 30, 20, 10]
Ini lebih sederhana daripada logika manual yang dijelaskan dalam video.
19. Sorting data custom
Misalnya kita punya class:
class Person {
String name;
int age;
Person(this.name, this.age);
@override
String toString() {
return '$name ($age)';
}
}
Kemudian:
List<Person> people = [
Person('Sam', 34),
Person('John', 21),
Person('Alex', 18),
Person('Mark', 36),
Person('James', 25),
];
Kita ingin mengurutkan berdasarkan umur:
people.sort((a, b) => a.age.compareTo(b.age));
Hasil:
Alex (18)
John (21)
James (25)
Sam (34)
Mark (36)
Kalau descending:
people.sort((a, b) => b.age.compareTo(a.age));
Jadi sort() tidak hanya bisa digunakan untuk angka/string, tetapi juga object buatan kita sendiri.
20. shuffle()
shuffle() digunakan untuk mengacak isi List.
List<int> numbers = [1, 2, 3, 4, 5];
numbers.shuffle();
print(numbers);
Misalnya hasil:
[3, 1, 5, 2, 4]
Kalau dijalankan lagi, hasil pengacakannya bisa berbeda.
Sangat berguna untuk:
- Quiz
- Game
- Soal acak
- Random question
- Random item
21. sublist()
sublist() digunakan untuk mengambil sebagian isi List.
Contoh:
List<int> numbers = [
1, 2, 3, 4, 5,
6, 7, 8, 9, 10
];
List<int> result = numbers.sublist(0, 5);
print(result);
Hasil:
[1, 2, 3, 4, 5]
Sekali lagi:
sublist(start, end)
end tidak termasuk.
Jadi:
sublist(0, 5)
mengambil index:
0, 1, 2, 3, 4
22. where()
Ini salah satu method paling penting.
where() digunakan untuk memfilter data berdasarkan kondisi.
Misalnya:
List<String> fruits = [
'Mango',
'Apple',
'Lemon',
'Orange',
'Kiwi'
];
var result = fruits.where(
(fruit) => fruit.contains('o'),
);
Hasil secara konsep:
Mango
Lemon
Orange
Tetapi where() menghasilkan Iterable.
Kalau kita ingin List:
List<String> result = fruits
.where((fruit) => fruit.contains('o'))
.toList();
Hasil:
[Mango, Lemon, Orange]
Perbedaan where() dan removeWhere()
Ini penting:
where()
➡️ mengambil/memfilter data dan biasanya menghasilkan data baru.
Sedangkan:
removeWhere()
➡️ menghapus data dari List asli.
Contoh:
var filtered = fruits.where(...).toList();
fruits tetap ada.
Sedangkan:
fruits.removeWhere(...);
fruits berubah.
23. where() dengan Object
Misalnya ada:
class Employee {
String name;
String position;
Employee(this.name, this.position);
}
Kemudian:
List<Employee> employees = [
Employee('Sam', 'Developer'),
Employee('Mark', 'Manager'),
Employee('Alex', 'Designer'),
Employee('James', 'Manager'),
Employee('John', 'Developer'),
];
Kita ingin mengambil semua manager:
List<Employee> managers = employees
.where((employee) => employee.position == 'Manager')
.toList();
Hasilnya:
Mark
James
Ini sangat berguna dalam aplikasi nyata.
Misalnya:
Semua User
↓
filter berdasarkan role
↓
Admin saja
24. whereType<T>()
Video menyebutnya where type, tetapi nama method Dart yang tepat adalah:
whereType<T>()
Digunakan untuk mengambil data berdasarkan tipe datanya.
Misalnya List memiliki berbagai tipe:
List<dynamic> data = [
10,
'Sam',
20.5,
'John',
55,
'Mark',
];
Kalau kita hanya ingin String:
List<String> names = data.whereType<String>().toList();
Hasil:
[Sam, John, Mark]
Kalau hanya ingin integer:
List<int> numbers = data.whereType<int>().toList();
Hasil:
[10, 55]
25. map()
map() juga merupakan method yang sangat penting dalam Flutter.
Konsepnya:
Ambil setiap elemen → lakukan operasi → menghasilkan nilai baru.
Misalnya:
List<String> fruits = [
'mango',
'apple',
'lemon'
];
Kita ingin mengubah semuanya menjadi huruf kapital:
List<String> newFruits = fruits
.map((fruit) => fruit.toUpperCase())
.toList();
Hasil:
[MANGO, APPLE, LEMON]
26. Perbedaan where() dan map()
Ini wajib dipahami.
where()
Digunakan untuk memilih/filter.
[1, 2, 3, 4, 5]
Misalnya hanya angka > 3:
[4, 5]
map()
Digunakan untuk mengubah setiap data.
[1, 2, 3]
Misalnya dikali 2:
[2, 4, 6]
Jadi:
where → pilih
map → ubah
27. reduce()
reduce() digunakan ketika kita ingin menggabungkan semua elemen menjadi satu nilai.
Contoh:
List<int> numbers = [10, 20, 30, 40];
int sum = numbers.reduce((value, next) => value + next);
print(sum);
Prosesnya kira-kira:
10 + 20 = 30
30 + 30 = 60
60 + 40 = 100
Hasil:
100
Berbeda dengan map() atau where() yang menghasilkan kumpulan data.
reduce() menghasilkan satu nilai.
28. Keterbatasan reduce()
reduce() bekerja menggunakan elemen List sebagai nilai awal.
Misalnya:
List<int> numbers = [10, 20, 30];
Maka hasil akhirnya harus kompatibel dengan tipe elemen tersebut.
Untuk operasi yang membutuhkan initial value atau hasil tipe lain, biasanya lebih cocok menggunakan fold().
29. fold()
fold() mirip dengan reduce(), tetapi memiliki nilai awal.
Contoh:
List<int> numbers = [10, 20, 30, 40];
int sum = numbers.fold(
0,
(previous, element) => previous + element,
);
Hasil:
100
Kita bisa mengubah nilai awal:
int sum = numbers.fold(
5,
(previous, element) => previous + element,
);
Maka:
5 + 10 + 20 + 30 + 40
Hasil:
105
30. Perbedaan reduce() dan fold()
Cara gampang mengingat:
| Method | Nilai awal | Hasil |
|---|---|---|
reduce() | Tidak ada | Satu nilai |
fold() | Ada | Satu nilai, bisa tipe berbeda |
Contoh:
numbers.reduce(...)
vs
numbers.fold(0, ...)
fold() lebih fleksibel karena kita menentukan nilai awal.
31. toList()
toList() mengubah Iterable menjadi List.
Contoh:
var result = numbers.where((number) => number > 10);
result adalah Iterable.
Kalau ingin List:
List<int> result = numbers
.where((number) => number > 10)
.toList();
Ini sangat sering kita temui:
.where(...)
.toList()
atau:
.map(...)
.toList()
32. toSet()
Mengubah List menjadi Set.
Perbedaan penting:
Settidak menyimpan duplicate value.
Misalnya:
List<int> numbers = [10, 20, 30, 20, 40];
Set<int> result = numbers.toSet();
print(result);
Hasil:
{10, 20, 30, 40}
20 yang tadinya muncul dua kali sekarang hanya muncul sekali.
Ini berguna misalnya untuk menghilangkan data duplikat.
33. asMap()
Video menyebut toMap, tetapi untuk mengubah List menjadi representasi map berdasarkan index, method yang relevan adalah:
asMap()
Contoh:
List<String> names = [
'Sam',
'John',
'Alex'
];
Map<int, String> result = names.asMap();
print(result);
Hasilnya secara konsep:
{
0: Sam,
1: John,
2: Alex
}
Index menjadi key:
0 → Sam
1 → John
2 → Alex
34. every()
every() digunakan untuk mengecek:
Apakah SEMUA elemen memenuhi kondisi?
Contoh:
List<String> fruits = [
'Mango',
'Lemon',
'Orange'
];
bool result = fruits.every(
(fruit) => fruit.contains('o'),
);
Periksa:
Mango → punya o ✓
Lemon → punya o ✓
Orange → punya o ✓
Maka:
true
Kalau ada satu saja yang tidak memenuhi kondisi:
false
35. any()
any() digunakan untuk mengecek:
Apakah setidaknya ada satu elemen yang memenuhi kondisi?
Contoh:
List<String> fruits = [
'Mango',
'Apple',
'Lemon'
];
bool result = fruits.any(
(fruit) => fruit.contains('o'),
);
Mango memiliki o.
Berarti sudah ada minimal satu yang memenuhi kondisi.
Hasil:
true
36. Perbedaan every() dan any()
Ini juga sangat penting.
every()
Semua harus memenuhi.
A ✓
B ✓
C ✓
→ true
Kalau:
A ✓
B ✗
C ✓
→ false
any()
Cukup satu yang memenuhi.
A ✗
B ✓
C ✗
→ true
Cara mengingat:
every = semuanya
any = salah satu/setidaknya satu
37. Ringkasan seluruh method
Supaya lebih mudah dihafal, kelompokkan berdasarkan fungsinya.
🔍 Mengecek informasi
length
first
last
isEmpty
isNotEmpty
➕ Menambahkan
add()
addAll()
insert()
insertAll()
➖ Menghapus
remove()
removeAt()
removeLast()
removeRange()
removeWhere()
clear()
🔎 Mencari/filter
indexOf()
lastIndexOf()
where()
whereType()
🔄 Mengubah/transformasi
map()
toList()
toSet()
asMap()
📊 Mengolah data
reduce()
fold()
🔀 Mengurutkan/mengacak
sort()
shuffle()
reversed
✅ Mengecek kondisi
every()
any()
✂️ Mengambil sebagian
sublist()
38. Contoh kasus nyata di Flutter
Misalnya kita memiliki daftar produk:
List<String> products = [
'Laptop',
'Mouse',
'Keyboard',
'Monitor',
];
Menampilkan jumlah produk
print(products.length);
Menambahkan produk
products.add('Headset');
Menghapus produk
products.remove('Mouse');
Mencari produk tertentu
print(products.contains('Laptop'));
Filter produk
var result = products
.where((product) => product.contains('o'))
.toList();
Mengurutkan produk
products.sort();
Membalik urutan
var reversedProducts = products.reversed.toList();
Semua operasi seperti ini sangat sering muncul ketika membuat aplikasi Flutter.
39. Yang paling penting untuk kamu kuasai
Kalau kamu baru belajar Dart/Flutter, jangan mencoba menghafal semua method sekaligus.
Prioritaskan ini dulu:
1. length
2. add()
3. addAll()
4. insert()
5. remove()
6. removeAt()
7. clear()
8. where()
9. map()
10. sort()
11. contains()
12. any()
13. every()
14. toList()
15. toSet()
Terutama pahami 3 konsep ini:
WHERE → memilih data
MAP → mengubah data
REDUCE/FOLD → menggabungkan data menjadi satu nilai
Contoh sederhananya:
List<int> numbers = [1, 2, 3, 4, 5];
Filter angka genap:
numbers.where((number) => number.isEven).toList();
Hasil:
[2, 4]
Ubah semua angka menjadi dua kali lipat:
numbers.map((number) => number * 2).toList();
Hasil:
[2, 4, 6, 8, 10]
Jumlahkan semuanya:
numbers.reduce((a, b) => a + b);
Hasil:
15
Jadi secara konsep:
LIST
│
┌──────────┼──────────┐
↓ ↓ ↓
where map reduce
│ │ │
↓ ↓ ↓
pilih ubah gabung
│ │ │
↓ ↓ ↓
[2, 4] [2,4,6,8,10] 15
Kalau tiga konsep where → map → reduce/fold ini sudah benar-benar kamu pahami, kamu akan jauh lebih mudah memahami pengolahan data di Flutter, terutama ketika nanti berhadapan dengan JSON, API, model/class, ListView, dan state management.
I can also create an image yang menjelaskan alur List → where → map → reduce secara visual.