Terakhir diperbarui: 14 November 2024
Penulis: Habibie Ed Dien
Pada codelab ini, Anda akan mempelajari tentang pemrograman asynchronous di Flutter beserta contoh penggunaannya. Cara kerja, manfaat, dan cara mengelola thread asynchronous.
Video berikut menjelaskan tentang apa itu Future dan bagaimana manfaatnya terhadap pemrograman asynchronous. Silakan simak dan pahami!
Setelah menyelesaikan codelab ini Anda akan mampu untuk:
Berikut merupakan sumber daya yang diperlukan untuk menyelesaikan praktikum ini:
Pemrograman asynchronous (async) dimanfaatkan untuk aplikasi menyelesaikan tugas-tugas yang membutuhkan waktu (user harus menunggu hasilnya). Contohnya seperti mengunduh gambar dari web, menulis data ke web server, mengerjakan tugas paralel lainnya, hingga menangani inputan dari user. Dengan pemrograman async ini akan meningkatkan kualitas UX dan perangkat lunak kita.
Di Dart dan Flutter Anda dapat menulis program async dengan memanfaatkan Future dan pola async/await. Pola ini tersedia hampir di semua bahasa pemrograman modern. Flutter memiliki cara yang efisien untuk membangun UI async dengan class FutureBuilder.
Pada pertemuan 12 berikutnya, kita akan menggunakan streams yaitu lanjutan dari pemrograman async.
Operasi async banyak digunakan dalam program untuk menyelesaikan pekerjaan paralel yang memerlukan waktu tunggu sampai operasi lain selesai. Beberapa operasi async yang sering dilakukan diantaranya:
Ketika Anda menulis kode program, pada umumnya berjalan secara sekuensial (baris per baris). Sebagai contoh kode berikut:
int x = 3;
int y = x * 7;
Anda akan menebak bahwa nilai y sama dengan 21 karena instruksi kode x = 3 telah dieksekusi sebelum baris berikutnya. Dengan kata lain, baris kedua menunggu untuk instruksi baris pertama diselesaikan terlebih dahulu.
Pada banyak kasus, pola seperti itu sangatlah sempurna, namun pada beberapa kasus, khususnya ketika Anda butuh waktu untuk menyelesaikan instruksi kode yang lebih lama, hal itu tidak direkomendasikan karena akan membuat tampilan aplikasi menjadi tidak responsif. Itulah mengapa hampir semua bahasa pemrograman modern termasuk Dart dapat melakukan operasi asynchronous (async).
Operasi async tidak akan menghentikan eksekusi kode pada baris utama, sehingga dapat menyelesaikan operasi secara paralel dengan operasi di kode baris utama.
Perhatikan gambar diagram berikut ini.

Pada diagram tersebut, Anda dapat melihat baris eksekusi utama, yaitu pada bagian UI, dapat melakukan pemanggilan operasi async (misalnya akses data via jaringan, database atau Stream). Namun, UI tetap dieksekusi tanpa harus menunggu hasil operasi async selesai.
Dart adalah bahasa single-thread, namun Anda dapat melakukan operasi async agar dapat membuat aplikasi yang responsif. Di Dart dan Flutter Anda dapat menggunakan class Future untuk melakukan operasi async.
Dalam codelab ini, kita akan membangun aplikasi books menggunakan plugin http untuk membaca data JSON dari Google Books API.
Selesaikan langkah-langkah praktikum berikut ini menggunakan editor Visual Studio Code (VS Code) atau Android Studio atau code editor lain kesukaan Anda. Jawablah di laporan praktikum Anda pada setiap soal yang ada di beberapa langkah praktikum ini.
Buatlah sebuah project flutter baru dengan nama books di folder src week-11 repository GitHub Anda.
Kemudian Tambahkan dependensi http dengan mengetik perintah berikut di terminal.
flutter pub add http
pubspec.yamlJika berhasil install plugin, pastikan plugin http telah ada di file pubspec ini seperti berikut.
dependencies:
flutter:
sdk: flutter
http: ^1.1.0
Jika Anda menggunakan macOS, Anda harus mengaktifkan fitur networking pada file macos/Runner/DebugProfile.entitlements dan macos/Runner/Release.entitlements dengan menambahkan kode berikut:

main.dartKetiklah kode seperti berikut ini.

getData()Tambahkan method ini ke dalam class _FuturePageState yang berguna untuk mengambil data dari API Google Books.

ElevatedButtonTambahkan kode pada onPressed di ElevatedButton seperti berikut.

Lakukan run aplikasi Flutter Anda. Anda akan melihat tampilan akhir seperti gambar berikut. Jika masih terdapat error, silakan diperbaiki hingga bisa running.

Ada alternatif penggunaan Future yang lebih clean, mudah dibaca dan dirawat, yaitu pola async/await. Intinya pada dua kata kunci ini:
async digunakan untuk menandai suatu method sebagai asynchronous dan itu harus ditambahkan di depan kode function.await digunakan untuk memerintahkan menunggu sampai eksekusi suatu function itu selesai dan mengembalikan sebuah value. Untuk then bisa digunakan pada jenis method apapun, sedangkan await hanya bekerja di dalam method async.Berikut ini contoh kode perbedaan Future dengan then dan async/await.

Untuk memahami lebih dalam penggunaan async/await, simaklah video berikut.
Setelah Anda menyelesaikan praktikum 1, Anda dapat melanjutkan praktikum 2 ini. Selesaikan langkah-langkah praktikum berikut ini menggunakan editor Visual Studio Code (VS Code) atau Android Studio atau code editor lain kesukaan Anda. Jawablah di laporan praktikum Anda pada setiap soal yang ada di beberapa langkah praktikum ini.
Pada codelab ini, kita akan menambah kode dari aplikasi books di praktikum sebelumnya.
main.dartTambahkan tiga method berisi kode seperti berikut di dalam class _FuturePageState.
Future<int> returnOneAsync() async {
await Future.delayed(const Duration(seconds: 3));
return 1;
}
Future<int> returnTwoAsync() async {
await Future.delayed(const Duration(seconds: 3));
return 2;
}
Future<int> returnThreeAsync() async {
await Future.delayed(const Duration(seconds: 3));
return 3;
}
count()Lalu tambahkan lagi method ini di bawah ketiga method sebelumnya.

count()Lakukan comment kode sebelumnya, ubah isi kode onPressed() menjadi seperti berikut.

Akhirnya, run atau tekan F5 jika aplikasi belum running. Maka Anda akan melihat seperti gambar berikut, hasil angka 6 akan tampil setelah delay 9 detik.

Menggunakan Future dengan then, catchError, async, dan await mungkin sudah cukup untuk banyak kasus, tetapi ada alternatif melakukan operasi async di Dart dan Flutter yaitu dengan class Completer.
Completer membuat object Future yang mana Anda dapat menyelesaikannya nanti (late) dengan return sebuah value atau error.
Setelah Anda menyelesaikan praktikum 2, Anda dapat melanjutkan praktikum 3 ini. Selesaikan langkah-langkah praktikum berikut ini menggunakan editor Visual Studio Code (VS Code) atau Android Studio atau code editor lain kesukaan Anda. Jawablah di laporan praktikum Anda pada setiap soal yang ada di beberapa langkah praktikum ini.
main.dartPastikan telah impor package async berikut.
import 'package:async/async.dart';
Tambahkan variabel late dan method di class _FuturePageState seperti ini.
late Completer completer;
Future getNumber() {
completer = Completer<int>();
calculate();
return completer.future;
}
Future calculate() async {
await Future.delayed(const Duration(seconds : 5));
completer.complete(42);
}
onPressed()Tambahkan kode berikut pada fungsi onPressed(). Kode sebelumnya bisa Anda comment.

Terakhir, run atau tekan F5 untuk melihat hasilnya jika memang belum running. Bisa juga lakukan hot restart jika aplikasi sudah running. Maka hasilnya akan seperti gambar berikut ini. Setelah 5 detik, maka angka 42 akan tampil.

calculate()Gantilah isi code method calculate() seperti kode berikut, atau Anda dapat membuat calculate2()

onPressed()Ganti menjadi kode seperti berikut.
getNumber().then((value) {
setState(() {
result = value.toString();
});
}).catchError((e) {
result = 'An error occurred';
});
Ketika Anda membutuhkan untuk menjalankan banyak Future secara bersamaan, ada sebuah class yang dapat Anda gunakan yaitu: FutureGroup.
FutureGroup tersedia di package async, yang mana itu harus diimpor ke file dart Anda, seperti berikut.
import 'package:async/async.dart';
FutureGroup adalah sekumpulan dari Future yang dapat run secara paralel. Ketika run secara paralel, maka konsumsi waktu menjadi lebih hemat (cepat) dibanding run method async secara single setelah itu method async lainnya.
Ketika semua code async paralel selesai dieksekusi, maka FutureGroup akan return value sebagai sebuah List, sama juga ketika ingin menambahkan operasi paralel dalam bentuk List.
Setelah Anda menyelesaikan praktikum 3, Anda dapat melanjutkan praktikum 4 ini. Selesaikan langkah-langkah praktikum berikut ini menggunakan editor Visual Studio Code (VS Code) atau Android Studio atau code editor lain kesukaan Anda. Jawablah di laporan praktikum Anda pada setiap soal yang ada di beberapa langkah praktikum ini.
main.dartTambahkan method ini ke dalam class _FuturePageState

onPressed()Anda bisa hapus atau comment kode sebelumnya, kemudian panggil method dari langkah 1 tersebut.

Anda akan melihat hasilnya dalam 3 detik berupa angka 6 lebih cepat dibandingkan praktikum sebelumnya menunggu sampai 9 detik.
futureGroupAnda dapat menggunakan FutureGroup dengan Future.wait seperti kode berikut.
final futures = Future.wait<int>([
returnOneAsync(),
returnTwoAsync(),
returnThreeAsync(),
]);
Ada beberapa teknik untuk melakukan handle error pada code async. Pada praktikum ini Anda akan menggunakan 2 cara, yaitu then() callback dan pola async/await.
Setelah Anda menyelesaikan praktikum 4, Anda dapat melanjutkan praktikum 5 ini. Selesaikan langkah-langkah praktikum berikut ini menggunakan editor Visual Studio Code (VS Code) atau Android Studio atau code editor lain kesukaan Anda. Jawablah di laporan praktikum Anda pada setiap soal yang ada di beberapa langkah praktikum ini.
main.dartTambahkan method ini ke dalam class _FuturePageState

Ganti dengan kode berikut

Lakukan run dan klik tombol GO! maka akan menghasilkan seperti gambar berikut.

Pada bagian debug console akan melihat teks Complete seperti berikut.

handleError()Tambahkan kode ini di dalam class _FutureStatePage

Seperti yang Anda telah pelajari, Stateless widget tidak dapat menyimpan informasi (state), StatefulWidget dapat mengelola variabel dan properti dengan method setState(), yang kemudian dapat ditampilkan pada UI. State adalah informasi yang dapat berubah selama life cycle widget itu berlangsung.
Ada 4 method utama dalam life cycle StatefullWidget:
initState(): dipanggil sekali ketika state dibangun. Bisa dikatakan ini juga sebagai konstruktor class.build(): dipanggil setiap kali ada perubahan state atau UI. Method ini melakukan destroy UI dan membangun ulang dari nol.deactive() dan dispose(): digunakan untuk menghapus widget dari tree, pada beberapa kasus dimanfaatkan untuk menutup koneksi ke database atau menyimpan data sebelum berpindah screen.Setelah Anda menyelesaikan praktikum 5, Anda dapat melanjutkan praktikum 6 ini. Selesaikan langkah-langkah praktikum berikut ini menggunakan editor Visual Studio Code (VS Code) atau Android Studio atau code editor lain kesukaan Anda. Jawablah di laporan praktikum Anda pada setiap soal yang ada di beberapa langkah praktikum ini.
Tambahkan plugin geolocator dengan mengetik perintah berikut di terminal.
flutter pub add geolocator
Jika Anda menargetkan untuk platform Android, maka tambahkan baris kode berikut di file android/app/src/main/androidmanifest.xml
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
Jika Anda menargetkan untuk platform iOS, maka tambahkan kode ini ke file Info.plist
<key>NSLocationWhenInUseUsageDescription</key>
<string>This app needs to access your location</string>
geolocation.dartTambahkan file baru ini di folder lib project Anda.
Buat class LocationScreen di dalam file geolocation.dart
geolocation.dart
Panggil screen baru tersebut di file main Anda seperti berikut.
home: LocationScreen(),
Run project Anda di device atau emulator (bukan browser), maka akan tampil seperti berikut ini.

Tambahkan widget loading seperti kode berikut. Lalu hot restart, perhatikan perubahannya.

Pola ketika menerima beberapa data secara async dan melakukan update pada UI sebenarnya itu tergantung pada ketersediaan data. Secara umum fakta di Flutter, ada sebuah widget yang membantu Anda untuk memudahkan manajemen future yaitu widget FutureBuilder.
Anda dapat menggunakan FutureBuilder untuk manajemen future bersamaan dengan update UI ketika ada update Future. FutureBuilder memiliki status future sendiri, sehingga Anda dapat mengabaikan penggunaan setState, Flutter akan membangun ulang bagian UI ketika update itu dibutuhkan.
Untuk lebih memahami widget FutureBuilder, mari kita coba dengan praktikum ini.
Setelah Anda menyelesaikan praktikum 6, Anda dapat melanjutkan praktikum 7 ini. Selesaikan langkah-langkah praktikum berikut ini menggunakan editor Visual Studio Code (VS Code) atau Android Studio atau code editor lain kesukaan Anda. Jawablah di laporan praktikum Anda pada setiap soal yang ada di beberapa langkah praktikum ini.
getPosition()Buka file geolocation.dart kemudian ganti isi method dengan kode ini.

Tambah variabel ini di class _LocationScreenState

initState()Tambah method ini dan set variabel position

build()Ketik kode berikut dan sesuaikan. Kode lama bisa Anda comment atau hapus.

Tambahkan kode berikut untuk menangani ketika terjadi error. Kemudian hot restart.
else if (snapshot.connectionState == ConnectionState.done) {
if (snapshot.hasError) {
return Text('Something terrible happened!');
}
return Text(snapshot.data.toString());
}
Praktikum kali ini Anda akan melihat manfaat Future untuk Navigator dalam transformasi Route menjadi sebuah function async. Anda akan melakukan push screen baru dan fungsi await menunggu data untuk melakukan update warna background pada screen.
Setelah Anda menyelesaikan praktikum 7, Anda dapat melanjutkan praktikum 8 ini. Selesaikan langkah-langkah praktikum berikut ini menggunakan editor Visual Studio Code (VS Code) atau Android Studio atau code editor lain kesukaan Anda. Jawablah di laporan praktikum Anda pada setiap soal yang ada di beberapa langkah praktikum ini.
navigation_first.dartBuatlah file baru ini di project lib Anda.
navigation_first.dart
class _NavigationFirstStateTambahkan method ini.
Future _navigateAndGetColor(BuildContext context) async {
color = await Navigator.push(context,
MaterialPageRoute(builder: (context) => const NavigationSecond()),) ?? Colors.blue;
setState(() {});
});
}
navigation_second.dartBuat file baru ini di project lib Anda. Silakan jika ingin mengelompokkan view menjadi satu folder dan sesuaikan impor yang dibutuhkan.

main.dartLakukan edit properti home.
home: const NavigationFirst(),
Lakukan run, jika terjadi error silakan diperbaiki.
Hasilnya akan seperti gambar berikut ini.

Pada praktikum ini, Anda akan memanfaatkan widget AlertDialog. Anda bisa manfaatkan widget ini misal untuk memilih operasi Save, Delete, Accept, dan sebagainya.
Setelah Anda menyelesaikan praktikum 8, Anda dapat melanjutkan praktikum 9 ini. Selesaikan langkah-langkah praktikum berikut ini menggunakan editor Visual Studio Code (VS Code) atau Android Studio atau code editor lain kesukaan Anda. Jawablah di laporan praktikum Anda pada setiap soal yang ada di beberapa langkah praktikum ini.
navigation_dialog.dartBuat file dart baru di folder lib project Anda.
navigation_dialog.dart

ElevatedButton
main.dartUbah properti home

Coba ganti warna background dengan widget dialog tersebut. Jika terjadi error, silakan diperbaiki. Jika berhasil, akan tampil seperti gambar berikut.

Selamat Anda telah menyelesaikan Codelab ini. Anda telah mempelajari terkait pemrograman async dan contoh penggunaannya.
Pada codelab berikutnya, Anda akan mempelajari tentang Pemrograman Asynchronous lanjutan dengan streams dan state BLoC.
Jangan sungkan jika Anda menemukan kesalahan pada codelab ini untuk merevisi atau sekedar melaporkan issue melalui tautan di pojok kiri bawah (Report a mistake).
Silakan cek beberapa sumber belajar lainnya...