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_riverpodvəriverpod_annotation. - dev asılılıqları:
riverpod_generatorvəbuild_runner. - Generasiya:
dart run build_runner watch -d. - Faylın başında
part 'fayl.g.dart';direktivi olmalıdır. riverpod_lintisə əsas quraşdırmanın hissəsi deyil —analysis_options.yamlvasitə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.
// ---------- Ə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ə.
| Meyar | Codegen ilə | Codegen olmadan |
|---|---|---|
| Provider tipinin seçimi | Avtomatik — imzadan müəyyən olunur | Əl ilə seçilir |
| Parametrlər (family) | Adlı, opsional, default dəyərli — məhdudiyyətsiz | Bir pozisional arqument |
| autoDispose | Default aktiv; `@Riverpod(keepAlive: true)` ilə söndürülür | Açıq şəkildə göstərilir |
| Hot reload | Sənədə görə Riverpod kodunun stateful hot-reload-u dəstəklənir | Adi 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
- Kod generasiyası haqqındarəsmiriverpod.dev
Üstünlüklər, "hələ də yavaşdır" qeydi və nə vaxt seçmək lazım olduğu.
- Riverpod: quraşdırmarəsmiriverpod.dev
Paketlərin siyahısı, build_runner watch -d əmri və part direktivi.
- package:riverpod_generatorrəsmipub.dev
- package:riverpod_lintrəsmipub.dev
DO/DON'T qaydalarının bir hissəsini statik analizdə tutan opsional lint paketi.