Menu
CoddyTech

Async dalam Method Class

Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Dart di Coddy. Pelajaran 80 dari 110.

Sekarang setelah kamu tahu cara menangani inisialisasi asinkron dengan method factory, mari kita lihat cara membuat method instance biasa menjadi asinkron. Caranya mudah: cukup tambahkan async ke method mana pun dan buat method tersebut mengembalikan Future.

class WeatherService {
  String _location;
  
  WeatherService(this._location);
  
  Future<String> fetchTemperature() async {
    await Future.delayed(Duration(seconds: 1));
    return '22°C in $_location';
  }
  
  Future<void> updateLocation(String newLocation) async {
    await Future.delayed(Duration(milliseconds: 500));
    _location = newLocation;
    print('Location updated to $_location');
  }
}

Future<void> main() async {
  var service = WeatherService('London');
  var temp = await service.fetchTemperature();
  print(temp);
  
  await service.updateLocation('Paris');
}

method async dapat mengakses dan mengubah variabel instance seperti method biasa. Perbedaan utamanya adalah pemanggil harus menggunakan await untuk menunggu hasilnya. method yang mengembalikan Future<void> tidak mengembalikan nilai, tetapi tetap perlu ditunggu jika kamu ingin memastikan method tersebut selesai sebelum melanjutkan.

Kamu juga dapat menggabungkan beberapa pemanggilan async dalam sebuah method, atau memanggil method async lainnya dari class yang sama:

Future<String> getFullReport() async {
  var temp = await fetchTemperature();
  var humidity = await fetchHumidity();
  return '$temp, Humidity: $humidity';
}

Pola ini penting untuk class yang berinteraksi dengan sumber daya eksternal, seperti API, database, atau operasi apa pun yang membutuhkan waktu.

challenge icon

Tantangan

Mudah

Mari buat pelacak portofolio saham yang mengelola harga saham dan menghitung nilai portofolio menggunakan method async! Kamu akan membuat class yang menyimulasikan pengambilan data saham waktu nyata dan menggabungkan beberapa operasi async untuk menghasilkan laporan.

Kamu akan mengatur kodemu ke dalam dua file:

  • portfolio.dart: Buat class StockPortfolio yang melacak saham dan jumlahnya. Class-mu harus memiliki:
    • Map<String, int> privat bernama _holdings yang menyimpan simbol saham dan jumlah saham yang dimiliki
    • Constructor yang menginisialisasi _holdings sebagai map kosong
    • Method addStock(String symbol, int quantity) yang menambahkan atau memperbarui kepemilikan saham (tidak async)
    • Method async fetchPrice(String symbol) yang mengembalikan Future<double>. Simulasikan jeda selama 50 milidetik, lalu kembalikan harga yang dihitung sebagai: panjang simbol dikalikan 25.5
    • Method async getStockValue(String symbol) yang mengembalikan Future<double>. Method ini harus menunggu fetchPrice untuk simbol tersebut, mengalikannya dengan jumlah saham yang dimiliki, lalu mengembalikan nilai totalnya. Jika simbol tidak ada dalam holdings, kembalikan 0.0
    • Method async getTotalValue() yang mengembalikan Future<double>. Method ini harus menghitung nilai gabungan semua holdings dengan menunggu getStockValue untuk setiap saham dan menjumlahkan hasilnya
    • Method async generateReport() yang mengembalikan Future<String>. Method ini harus membuat laporan yang menampilkan nilai setiap saham dan nilai total. Format setiap baris sebagai [symbol]: $[value] (nilai dengan 1 angka desimal), diikuti baris terakhir Total: $[totalValue] (juga dengan 1 angka desimal)
  • main.dart: Impor file portofoliomu dan tunjukkan cara method async bekerja sama di dalam sebuah class:
    • Buat instance StockPortfolio
    • Tambahkan holdings berikut: AAPL dengan 10 saham, GOOGL dengan 5 saham, MSFT dengan 8 saham
    • Cetak Fetching portfolio data...
    • Tunggu dan cetak hasil generateReport()

Perhatikan bagaimana generateReport() memanggil method async lainnya dalam class yang sama, dan bagaimana setiap method dibangun berdasarkan method lainnya. Gunakan toStringAsFixed(1) untuk memformat nilai desimal!

Output yang diharapkan:

Fetching portfolio data...
AAPL: $1020.0
GOOGL: $637.5
MSFT: $816.0
Total: $2473.5

Coba sendiri

import 'portfolio.dart';

void main() async {
  // TODO: Buat instance StockPortfolio

  // TODO: Tambahkan kepemilikan saham:
  // - AAPL sebanyak 10 lembar saham
  // - GOOGL sebanyak 5 lembar saham
  // - MSFT sebanyak 8 lembar saham

  // TODO: Cetak "Fetching portfolio data..."

  // TODO: Tunggu dan cetak hasil generateReport()
}
quiz iconUji dirimu

Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.

Semua pelajaran di Pemrograman Berorientasi Objek

Latihan sendiri: Compiler Dart online