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.yaml
Jika 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.dart
Ketiklah kode seperti berikut ini.
getData()
Tambahkan method ini ke dalam class _FuturePageState
yang berguna untuk mengambil data dari API Google Books.
ElevatedButton
Tambahkan 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.dart
Tambahkan 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.dart
Pastikan 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.dart
Tambahkan 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.
futureGroup
Anda 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.dart
Tambahkan 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.dart
Tambahkan 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.dart
Buatlah file baru ini di project lib Anda.
navigation_first.dart
class _NavigationFirstState
Tambahkan method ini.
Future _navigateAndGetColor(BuildContext context) async {
color = await Navigator.push(context,
MaterialPageRoute(builder: (context) => const NavigationSecond()),) ?? Colors.blue;
setState(() {});
});
}
navigation_second.dart
Buat file baru ini di project lib Anda. Silakan jika ingin mengelompokkan view menjadi satu folder dan sesuaikan impor yang dibutuhkan.
main.dart
Lakukan 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.dart
Buat file dart baru di folder lib project Anda.
navigation_dialog.dart
ElevatedButton
main.dart
Ubah 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...