Dart
Codegen
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.
Örnek çözümü göster
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'));
}
Kendini test et
-
BindingGenerator ne üretir?
- Test kodu
- Bağlayıcı (binding) kodu
- Arayüz widget'ları
- Veritabanı tablosu
Cevabı göster
Bağlayıcı (binding) kodu — BindingGenerator native bağlayıcı kodu üretir.
-
const constructor
class NativeBinding {
final String name;
____ NativeBinding(this.name);
}
Cevabı göster
class NativeBinding {
final String name;
const NativeBinding(this.name);
}
-
Codegen parçalarını eşleştir
- NativeBinding
- Annotation
- BindingGenerator
- Üretici sınıf
- generate(...)
- Üretim metodu
- .g.dart
- Üretilen dosya
Sıradaki ders: Architecture