Apa Itu Dart Future?
Penerima dari future dapat menentukan callbacks yang akan menangani nilai atau kesalahan tersebut.
Sekarang coba perhatikan kode berikut:
- void main() {
- print('Creating the future');
- print('main() done');
- }
Tentunya Anda sudah mengetahui urutan program dan apa saja yang akan ditampilkan di panel kontrol. Bagaimana jika kita memindahkan urutan perintah print pertama ke objek tersebut pada objek future.
- void main() {
- final myFuture = Future(() {
- print('Creating the future');
- return 12;
- });
- print('main() done');
- }
Jika kode di atas dijalankan, maka fungsi main akan dieksekusikan sebelum fungsi yang ada di dalam Future(). Hal ini disebabkan apabila future masih berstatus uncompleted. Sehingga jika program dijalankan, permukaan konsol akan tampil seperti berikut:
- main() done
- Creating the future
Lantas bagaimana caranya kita membuat dan memanfaatkan future ini?
Uncompleted
Mari kita buat sebuah fungsi yang mengembalikan nilai Future.
- Future<String> getOrder() {
- return Future.delayed(Duration(seconds: 3), () {
- return 'Coffee Boba';
- });
- }
Di Future kita dapat menambahkan method delayed untuk menunda eksekusi kode di Future. Dimana parameter pertama berisi periode penundaan dan parameter kedua adalah blok kode atau fungsi yang akan dieksekusi.
Dalam hal ini kami menggunakan penundaan untuk menunda waktu eksekusi seolah-olah kami sedang mengambil data dari internet.
Karena nilai yang dikembalikan di Future berupa String, kita dapat secara eksplisit menentukan tipe parameter generik Future.
Completed with data
Kemudian setelah Future dijalankan, kita memerlukan handler untuk menangani status completed with data. Caranya gunakan method .then() dari objek Future.
- void main() {
- getOrder().then((value) {
- print('You order: $value');
- });
- print('Getting your order...');
- }
Fungsi getOrder() akan dijalankan secara asynchronous hingga setelah 3 detik kode Future akan dijalankan dan mengembalikan nilai.
- Getting your order...
- You order: Coffee Boba // Muncul setelah 3 detik
Bagaimana jika objek Future() mengembalikan kondisi "completed with error?" Bagaimana cara mengelolanya?
Completed with error
Kita kemudian dapat menambahkan method.catchError() setelah then. Jadi ketika terjadi kesalahan atau pengecualian di Future, blok kode ini akan dieksekusi. Mari kita ubah sedikit kode di atas untuk mengakomodasi skenario completed with error.
- void main() {
- getOrder().then((value) {
- print('You order: $value');
- }) .catchError((error) {
- print('Sorry. $error');
- });
- print('Getting your order...');
- }
- Future<String> getOrder() {
- return Future.delayed(Duration(seconds: 3), () {
- var isStockAvailable = false;
- if (isStockAvailable) {
- return 'Coffee Boba';
- } else {
- throw 'Our stock is not enough.';
- }
- });}
Pada titik ini, Anda sudah familiar dengan tiga keadaan pada Future dan cara menulis kode untuk menanganinya. Seperti pada main(), ada tiga blok kode yang mewakili keadaan masa depan:
- Fungsi getOrder() berisi Future yang uncompleted.
- Metode then() menangani kondisiComplited with Data.
- Metode CatchError() menangani kondisi Complited with Error.
Ada metode lain yang bisa kita gunakan yaitu whenComplete(). Metode ini akan dijalankan ketika fungsi Future selesai dijalankan, baik mengembalikan nilai atau kesalahan. Ini seperti blok terakhir dalam try-catch-finally.
- void main() {
- getOrder().then((value) {
- print('You order: $value');
- })
- .catchError((error) {
- print('Sorry. $error');
- })
- .whenComplete(() {
- print('Thank you'); });
- print('Getting your order...');
----------------------------------------------------------------------------