source_gen
- Dart kursu
- Uzman
- Ders 27/47
- 5 dk
source_gen ile kaynak kod üretimi öğrenirsin.
source_gen
source_gen, Builder üzerine kurulu bir çatıdır (framework). Dart kaynak kodunu çözümleyip (analyzer ile) kod üretmek için yüksek seviyeli API sağlar.
İki temel sınıf: Generator (kaynaktan üretilen kodu döndürür) ve GeneratorForAnnotation<T> (yalnızca @T ile işaretli sınıfları işler).
Kullanım: bir annotation tanımla, bir Generator yaz, SharedPartBuilder ile sar, build_runner çalıştır. Üretilen kod .g.dart dosyasına yazılır.
GeneratorForAnnotation
GeneratorForAnnotation<T>, yalnızca @T ile işaretli sınıfları işler. generateForAnnotatedElement metodu her işaretli sınıf için çağrılır.
Metot bir Element (sınıf bilgisi) ve ConstantReader (annotation değerleri) alır. Üretilen kodu String olarak döndürür.
Bu desen, elle fromJson/toJson yazmayı ortadan kaldırır. Annotation eklersin, Generator kodu üretir. json_serializable bu yaklaşımı kullanır.
Uygulama Annotation ve üretici tanımla
class GenAnnotation { const GenAnnotation(); String get name => 'GenAnnotation'; } annotation sınıfını tanımla. String generateFor(GenAnnotation a) => '// generated for ${a.name}'; fonksiyonunu tanımla. main içinde const a = GenAnnotation(); yarat ve print(generateFor(a)); ekle.
Başlangıç kodu
void main() {
// GenAnnotation sınıfını tanımla (const constructor, name getter)
// generateFor fonksiyonunu tanımla
// bir annotation yarat; generateFor ile yazdır
}Örnek çözüm
class GenAnnotation {
const GenAnnotation();
String get name => 'GenAnnotation';
}
String generateFor(GenAnnotation a) => '// generated for ${a.name}';
void main() {
const a = GenAnnotation();
print(generateFor(a));
}Beklenen çıktı
// generated for GenAnnotation
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 source_gen parçalarını eşleştir
| Kavram | Anlamı |
|---|---|
Generator |
Temel sınıf |
GeneratorForAnnotation |
Annotation'lü üretim |
@GenAnnotation |
İşaretleyici |
generate(...) |
Kod üreten metod |
2 GeneratorForAnnotation ne yapar?
- YAML çözümler
- Doğrudan .g.dart yazar
- analyzer'ı çalıştırır
- Annotation'lü sınıflar için kod üretir Doğru cevap
Açıklama: GeneratorForAnnotation yalnızca annotation'lü sınıfları işler.
3 Generator kalıtımı
class MyGenerator extends ____<GenAnnotation> { }
class MyGenerator extends GeneratorForAnnotation<GenAnnotation> { }
Açıklama: GeneratorForAnnotation annotation tabanlı üretim sağlar.