Sparround

Riverpod kod generasiyası (@riverpod)

Riverpod-un iki yazılış üsulu var: əl ilə (provider-i özünüz elan edirsiniz) və kod generasiyası (@riverpod annotasiyası ilə funksiya/sinif yazırsınız, provider generasiya olunur).

Quraşdırma (rəsmi sənədə görə):

  • Asılılıqlar: flutter_riverpodriverpod_annotation.
  • dev asılılıqları: riverpod_generatorbuild_runner.
  • Generasiya: dart run build_runner watch -d.
  • Faylın başında part 'fayl.g.dart'; direktivi olmalıdır.
  • riverpod_lint isə əsas quraşdırmanın hissəsi deyil — analysis_options.yaml vasitəsilə konfiqurasiya olunan opsional lint alətidir.

Annotasiya provider-in tipini özü müəyyən edir: Provider, FutureProvider, StreamProvider arasında əl ilə seçim etmək lazım gəlmir — funksiyanın imzasına baxılır. myFunction adlı funksiya üçün myFunctionProvider generasiya olunur.

dart
// ---------- Əl ilə ----------
final todoRepositoryProvider = Provider<TodoRepository>((ref) {
  return TodoRepository(ref.watch(apiClientProvider));
});

final todosProvider =
    AsyncNotifierProvider<TodosNotifier, List<Todo>>(TodosNotifier.new);

// family: yalnız bir pozisional arqument
final productProvider = FutureProvider.family<Product, String>(
  (ref, id) => ref.watch(catalogRepositoryProvider).fetch(id),
);

// ---------- Codegen ----------
// fayl: todos.dart
part 'todos.g.dart';

@riverpod
TodoRepository todoRepository(Ref ref) {
  return TodoRepository(ref.watch(apiClientProvider));
}

@riverpod
class Todos extends _$Todos {
  @override
  Future<List<Todo>> build() => ref.watch(todoRepositoryProvider).fetchAll();

  Future<void> add(String title) async { /* ... */ }
}

// Parametrlər adi funksiya arqumentləridir: adlı, opsional, default dəyərli.
@riverpod
Future<List<Product>> search(
  Ref ref, {
  required String query,
  int page = 1,
}) {
  return ref.watch(catalogRepositoryProvider).search(query, page: page);
}

// İstifadə: ref.watch(searchProvider(query: 'telefon'));

Eyni provider: əl ilə və codegen ilə.

MeyarCodegen iləCodegen olmadan
Provider tipinin seçimiAvtomatik — imzadan müəyyən olunurƏl ilə seçilir
Parametrlər (family)Adlı, opsional, default dəyərli — məhdudiyyətsizBir pozisional arqument
autoDisposeDefault aktiv; `@Riverpod(keepAlive: true)` ilə söndürülürAçıq şəkildə göstərilir
Hot reloadSənədə görə Riverpod kodunun stateful hot-reload-u dəstəklənirAdi Flutter hot reload
Build vaxtıArtır — sənəd codegen-in "hələ də kifayət qədər yavaş" olduğunu qeyd edirƏlavə addım yoxdur

Sənədin dürüst tövsiyəsi: kod generasiyasının faydaları çoxdur, lakin o hələ də kifayət qədər yavaşdır; ona görə codegen-i artıq başqa paketlər üçün (freezed, json_serializable) istifadə edirsinizsə əlavə etmək məntiqlidir, təkbaşına gətirmək isə yox. Bu, müsahibədə balanslı mövqe üçün yaxşı istinaddır.

📚 Mənbələr və sənədlər