Konstruktor Asinkron
Termasuk bagian Pemrograman Berorientasi Objek dalam perjalanan Dart di Coddy. Pelajaran 79 dari 110.
Constructor di Dart tidak bisa ditandai sebagai async, constructor harus langsung mengembalikan sebuah instance dari class, bukan Future. Jadi, bagaimana cara membuat object yang memerlukan inisialisasi asinkron, seperti memuat data dari database atau mengambil konfigurasi?
Solusinya adalah menggunakan method factory async statis. Buat constructornya tetap privat (atau sederhana), lalu sediakan method statis yang melakukan pekerjaan async dan mengembalikan Future dari class-mu:
class UserProfile {
final String name;
final int age;
UserProfile._(this.name, this.age); // Konstruktor privat
static Future<UserProfile> create(String userId) async {
// Simulasikan pengambilan data
await Future.delayed(Duration(seconds: 1));
return UserProfile._('Alice', 25);
}
}
Future<void> main() async {
var user = await UserProfile.create('123');
print(user.name); // Alice
}Constructor privat UserProfile._ menangani pembuatan object yang sebenarnya, sedangkan method statis create() menangani semua pekerjaan asinkron. Pemanggil menggunakan await untuk mendapatkan object yang telah diinisialisasi sepenuhnya.
Pola ini memastikan object-mu benar-benar siap digunakan saat kamu mendapatkannya, tanpa kondisi yang baru diinisialisasi sebagian atau data yang hilang. Pola ini umum digunakan untuk class yang perlu memuat resource, terhubung ke layanan, atau melakukan penyiapan yang membutuhkan waktu.
Tantangan
MudahMari kita buat pemuat konfigurasi yang menunjukkan cara menangani inisialisasi asinkron di dalam class! Karena konstruktor tidak bisa bersifat asinkron, kamu akan menggunakan pola method factory statis untuk membuat object yang memerlukan waktu untuk "memuat" datanya.
Kamu akan menyusun kodemu dalam dua file:
config_loader.dart: Buat classConfigLoaderyang menyimulasikan pemuatan pengaturan konfigurasi secara asinkron. Class-mu harus memiliki:- Tiga field final:
appName(String),version(String), danmaxUsers(int) - Konstruktor privat yang menginisialisasi ketiga field
- Method factory async statis bernama
loadyang menerima parameterString configIddan mengembalikanFuture<ConfigLoader>. Method ini harus:- Menggunakan
Future.delayed()selama 100 milidetik untuk menyimulasikan waktu pemuatan - Membuat nilai konfigurasi berdasarkan
configId:appName: configId yang ditambahkan" App"di akhirversion:"1.0."diikuti panjang configIdmaxUsers: panjang configId dikalikan 10
- Mengembalikan instance
ConfigLoaderbaru dengan nilai-nilai ini
- Menggunakan
- Method
displayInfo()yang mencetak konfigurasi dalam format ini:Config: [appName] v[version] (max [maxUsers] users)
- Tiga field final:
main.dart: Impor pemuat konfigurasi dan tunjukkan pola inisialisasi asinkron:- Cetak
Loading configurations... - Muat konfigurasi dengan configId
"Production"dan panggildisplayInfo()miliknya - Muat konfigurasi dengan configId
"Dev"dan panggildisplayInfo()miliknya - Cetak
All configs loaded!
- Cetak
Perhatikan bagaimana method statis load menangani semua pekerjaan asinkron, sementara konstruktor privat hanya menetapkan nilai-nilai. Pemanggil menggunakan await untuk mendapatkan object yang sudah diinisialisasi sepenuhnya!
Output yang diharapkan:
Loading configurations...
Config: Production App v1.0.10 (max 100 users)
Config: Dev App v1.0.3 (max 30 users)
All configs loaded!Coba sendiri
import 'config_loader.dart';
void main() async {
// TODO: Cetak "Loading configurations..."
// TODO: Muat konfigurasi dengan configId "Production"
// dan panggil method displayInfo() miliknya
// TODO: Muat konfigurasi dengan configId "Dev"
// dan panggil method displayInfo() miliknya
// TODO: Cetak "All configs loaded!"
}
Pelajaran ini berisi kuis singkat. Mulai pelajarannya untuk menjawab kuis dan melacak progresmu.
Semua pelajaran di Pemrograman Berorientasi Objek
1Dasar-Dasar OOP
file Eksternallibrary dan ImporPengantar OOPClass dan ObjectKata kunci thismethodVariabel InstanceDasar-Dasar ConstructorRingkasan: Kalkulator Sederhana4Keamanan Null
Pengantar Keamanan NullBisa Null vs Tidak Bisa NullOperator ? dan !Kata Kunci late dan Keamanan NullOperator Penanganan NullKeamanan Null dalam classRangkuman: Sistem Profil Pengguna7class Abstrak & Antarmuka
class AbstrakMethod abstrakAntarmuka di DartAntarmuka ImplisitMengimplementasikan vs MemperluasBeberapa AntarmukaRingkasan: Kalkulator Bentuk10Koleksi dan Generik
Gambaran Umum list, set, dan MapKoleksi dengan Tipe AmanKelas GenerikMetode GenerikBatasan GenerikIterable dan IteratorUlasan: Penyimpanan Generik2Konstruktor dalam Dart
Konstruktor DefaultKonstruktor BernamaInitializer ListsKonstruktor KonstanKonstruktor FactoryKonstruktor RedirectingRangkuman, Pembuat Bentuk5Enkapsulasi
Member Publik vs PrivatKonvensi Prefiks _Privasi Tingkat libraryPendalaman Getter & SetterPenyembunyian InformasiRingkasan: Catatan Siswa8Mixin
Pengantar MixinMembuat MixinMenggunakan Beberapa MixinKata Kunci on pada MixinMixin vs. PewarisanMixin vs. InterfaceRangkuman: Sistem Hewan3Property Class
Anggota Instance vs StaticField Final dan ConstVariabel LateMethod dan Field StaticGetter dan SetterRangkuman: Pengelola Rekening Bank6Pewarisan
Pewarisan DasarKata Kunci superPenimpaan methodAnotasi @overrideKata Kunci class finalKonstruktor dan PewarisanRangkuman, Hierarki Karyawan9Polimorfisme
Dasar-Dasar PolimorfismePolimorfisme melalui AntarmukaPemeriksaan Tipe saat RuntimeOperator is & asKata Kunci KovarianRangkuman: Pemroses Pembayaran12OOP Asinkron
Futures & async/awaitDasar-Dasar StreamPengontrol StreamKonstruktor AsinkronAsync dalam Method ClassRangkuman: Pengambil DataLatihan sendiri: Compiler Dart online