CodeBlanks Logo Icon CodeBlanks

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.

Başlangıç kodu

main.dart
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

main.dart
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

Soru
class NativeBinding {
  final String name;
  ____ NativeBinding(this.name);
}
Cevap
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

Uzman bölümündeki tüm dersler