Menu
CoddyTech

Async dalam Method Class

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

Sekarang kamu sudah 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 lain 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 lembar saham yang dimiliki
    • Konstruktor 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 total. Jika simbol tidak ada dalam holdings, kembalikan 0.0
    • Method async getTotalValue() yang mengembalikan Future<double>. Method ini harus menghitung nilai gabungan semua kepemilikan 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 bersama di dalam class:
    • Buat instance StockPortfolio
    • Tambahkan kepemilikan berikut: AAPL sebanyak 10 lembar saham, GOOGL sebanyak 5 lembar saham, MSFT sebanyak 8 lembar saham
    • Cetak Fetching portfolio data...
    • Tunggu dan cetak hasil generateReport()

Perhatikan cara generateReport() memanggil method async lain di dalam class yang sama, dan cara 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 dari 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