Riverpod vs Bloc: Bu Projede Neden Riverpod
Bağımlılık grafiği, din değil

İlk üç ekranı Cubit ile açtım çünkü elime gelen örnekler öyleydi. Dördüncü ekran bir filtre çubuğuydı: sorgu metni, etiket, sıralama. Event yazmak için olay yoktu; kullanıcı kaydırıyordu. Yine de Event, State, Bloc, BlocProvider ve eşleme dosyası kopyalandı.
Riverpod'a geçiş bir din değiştirme değil. Bu projenin şekli: çok küçük parça, az olay günlüğü, testte tek bir bağımlılığı ezmek. Bloc duruyor; websocket ve giriş akışında hâlâ durabilir. Burada nedenini bu repo için yazıyorum.
Bu projenin şekli
Not uygulaması yazma ağırlıklı değil, okuma ve filtre ağırlıklı. Kullanıcı bir metin kutusuna yazıyor, liste anında daralıyor. Bunu Bloc event'ine çevirmek FilterChanged tiyatrosu. Asıl iş: sorgu değişince liste provider'ı yeniden hesaplanacak, eski isteğin sonucu geç gelecekse iptal edilecek.
Cubit ile de olur. Oldu da. Sürtünme, her yeni parçanın dört dosyaya yayılmasıydı. Bir kişi tek dosyada okuyamıyordu. Review'da event isimleri tartışılıyordu, filtre davranışı değil.
Aynı filtre, iki yazım
class NoteFilterCubit extends Cubit {
NoteFilterCubit() : super(const NoteFilter());
void query(String value) => emit(state.copyWith(query: value));
}
class NoteListBloc extends Bloc {
NoteListBloc(this.api, this.filter) : super(const NoteListState()) {
on(_load);
}
final NotesApi api;
final NoteFilter filter;
Future _load(NoteListRequested event, Emitter emit) async {
emit(state.copyWith(loading: true));
final rows = await api.search(filter);
emit(state.copyWith(loading: false, rows: rows));
}
}
final noteFilterProvider =
NotifierProvider(NoteFilterNotifier.new);
class NoteFilterNotifier extends Notifier {
@override
NoteFilter build() => const NoteFilter();
void query(String value) => state = state.copyWith(query: value);
}
final noteListProvider = FutureProvider.autoDispose>((ref) async {
final filter = ref.watch(noteFilterProvider);
return ref.watch(notesApiProvider).search(filter);
});
Alt blokta event tipi yok. Filtre değişince liste provider'ı kendiliğinden yenileniyor. autoDispose rotadan çıkınca isteği bırakıyor. Üst blok yanlış değil; bu ekranda fazla seremoni.
Grafik ve ezme
family ile not kimliğine bağlı detay provider'ı açıyorum. İki detay açıkken iki cache. Bloc'ta bunu map'te kendim tutuyordum; unutulunca eski notun state'i yeni rotaya sızıyordu.
Testte ProviderContainer içinde notesApiProvider override ediyorum. Mock Bloc, mock Cubit ve pump widget üçlüsü yerine tek ezme. Bu, test dininden değil, bağımlılıkların zaten grafikte olmasından geliyor.
Bloc'u bıraktığım yer değil
- Giriş ve token yenileme: olay sırası önemli, tekrar oynatma istiyorum.
- Cihazdan gelen event akışı: bağlantı koptu, kuyruk doldu, yeniden bağlandı.
- Ekip zaten Bloc okuyor ve bu ekran olay günlüğü ise zorla Riverpod etmiyorum.
Karşı yazılar genelde 'X ölçeklenir, Y ölçeklenmez' diye biter. Ölçek burada ekran sayısı değil, değişen parçanın büyüklüğü. Bu repo'da parçalar küçük. Riverpod o yüzden. Yarın olay günlüğü büyürse o ekranı Bloc'a geri vermek utanç değil; grafiği inat etmek utanç.
Yorumlar
Yorumlar (0)
Yorumlar üyelere açık. Üye ol · Giriş yap