Codegen
- Dart kursu
- Uzman
- Ders 45/47
- 6 dk
build_runner ile kod üretimi yazarsın.
Codegen
Şimdi kod üretimini ekleyeceğiz. Bir NativeBinding annotation sınıfı ve bir BindingGenerator sınıfı tanımlayacağız. Bu, build_runner + source_gen yaklaşımının sadeleştirilmiş bir modelidir.
NativeBinding, bir sınıfın native bağlamaya sahip olduğunu işaretler. BindingGenerator, işaretli sınıf için bağlayıcı kod üretir. Gerçekte build_runner bunu otomatik yapar; burada elle çağırıyoruz.
Bu derste gen.generate('NativeMathService') çağrısı, üretilen bağlayıcı kodu String olarak döndürür. Bu kod .g.dart dosyasına yazılacak kodun temsilidir.
Annotation sınıfı
Dart'ta annotation'lar const constructor'a sahip sınıflardır. class NativeBinding { final String name; const NativeBinding(this.name); } tanımı @NativeBinding('native_add') kullanımına izin verir.
BindingGenerator, sınıf adını alır ve bağlayıcı kodu üretir: String generate(String className) => '// generated binding for $className';. Gerçekte bu, FFI çağrılarını saran tam bir sınıf olurdu.
Bu model, source_gen'in GeneratorForAnnotation yaklaşımını yansıtır. Annotation işaretli sınıflar otomatik bulunur ve kod üretilir. Burada elle çağırıyoruz ama mekanizma aynı.
Uygulama NativeBinding ve BindingGenerator ekle
Aşağıdaki kodda NativeMathService zaten tanımlı. Şimdi bir class NativeBinding tanımla: final String name; const NativeBinding(this.name);. Bir class BindingGenerator tanımla: String generate(String className) => '// generated binding for $className';. main içinde final gen = BindingGenerator(); yarat ve print(gen.generate('NativeMathService')); ekle.
Başlangıç kodu
import 'dart:ffi';
abstract class MathService {
int add(int a, int b);
}
typedef NativeAdd = Int32 Function(Int32 a, Int32 b);
typedef DartAdd = int Function(int a, int b);
class NativeMathService implements MathService {
final String bindingName;
NativeMathService(this.bindingName);
@override
int add(int a, int b) => a + b;
String describe() => 'native: $bindingName';
}
// NativeBinding annotation sınıfını tanımla (const constructor, name alanı)
// BindingGenerator sınıfını tanımla (generate metodu)
void main() {
print('servis hazır');
final svc = NativeMathService('native_add');
print(svc.describe());
print('sonuç: ${svc.add(2, 3)}');
// bir BindingGenerator yarat; generate ile yazdır
}Örnek çözüm
import 'dart:ffi';
abstract class MathService {
int add(int a, int b);
}
typedef NativeAdd = Int32 Function(Int32 a, Int32 b);
typedef DartAdd = int Function(int a, int b);
class NativeMathService implements MathService {
final String bindingName;
NativeMathService(this.bindingName);
@override
int add(int a, int b) => a + b;
String describe() => 'native: $bindingName';
}
class NativeBinding {
final String name;
const NativeBinding(this.name);
}
class BindingGenerator {
String generate(String className) => '// generated binding for $className';
}
void main() {
print('servis hazır');
final svc = NativeMathService('native_add');
print(svc.describe());
print('sonuç: ${svc.add(2, 3)}');
final gen = BindingGenerator();
print(gen.generate('NativeMathService'));
}Beklenen çıktı
servis hazır native: native_add sonuç: 5 // generated binding for NativeMathService
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 BindingGenerator ne üretir?
- Test kodu
- Bağlayıcı (binding) kodu Doğru cevap
- Arayüz widget'ları
- Veritabanı tablosu
Açıklama: BindingGenerator native bağlayıcı kodu üretir.
2 const constructor
class NativeBinding {
final String name;
____ NativeBinding(this.name);
}
class NativeBinding {
final String name;
const NativeBinding(this.name);
}
Açıklama: const constructor annotation olarak kullanılabilir.
3 Codegen parçalarını eşleştir
| Kavram | Anlamı |
|---|---|
NativeBinding |
Annotation |
BindingGenerator |
Üretici sınıf |
generate(...) |
Üretim metodu |
.g.dart |
Üretilen dosya |