Macro
- Dart kursu
- İleri seviye
- Ders 22/83
- 5 dk
Dart 3 macro deneyi öğrenirsin.
Macro (Dart 3)
Dart 3, deneysel macro sistemi tanıttı. Macro'lar derleme zamanında kod üretir: bir sınıfa annotation eklendiğinde, derleyici otomatik metot/alan ekler.
Önceki yaklaşımlardan farkı: macro'lar derleyici içine gömülüdür; ayrı bir build_runner adımı gerektirmez. Bu, geliştirme döngüsünü hızlandırır.
Henüz deneysel olduğundan API değişebilir. Üretim için source_gen (kod üretimi) hâlâ önerilir; macro'lar gelecek vaat eder.
Annotation ile işaretleme
Macro'lar annotation (üst veri) ile tetiklenir. Bir sınıfa @MyMacro() eklendiğinde, derleyici macro tanımını çalıştırır ve üretilen kodu sınıfa enjekte eder.
Annotation'lar Dart'ta const constructor'a sahip sınıflardır. Örnek: class Generated { const Generated(); }. Sonra @Generated() class Service {}.
Macro'lar olmadan da annotation'lar runtime'da mirrors ile okunabilir; ama bu Flutter/AOT'de çalışmaz.
Uygulama Annotation tanımla ve uygula
class Generated { const Generated(); } annotation sınıfını tanımla. @Generated() ile işaretli class Service {} tanımla. main içinde print(Service().runtimeType); ekle.
Başlangıç kodu
void main() {
// Generated annotation sınıfını tanımla (const constructor)
// annotation ile işaretli Service sınıfını tanımla
// Service örneğinin tip adını yazdır
}Örnek çözüm
class Generated {
const Generated();
}
@Generated()
class Service {}
void main() {
print(Service().runtimeType);
}Beklenen çıktı
Service
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 Macro'lar ne zaman kod üretir?
- Çalışma zamanında
- Derleme zamanında Doğru cevap
- Yalnızca testte
- Sunucuda
Açıklama: macro'lar derleme zamanında kod üretir.
2 Yaklaşımları eşleştir
| Kavram | Anlamı |
|---|---|
Macro |
Derleme zamanı |
source_gen |
Build adımı |
dart:mirrors |
Çalışma zamanı |
runtimeType |
Basit tip |
3 Annotation uygula
@____()
class Service {}
@Generated()
class Service {}
Açıklama: @Generated() sınıfa annotation olarak eklenir.