CodeBlanks Logo Icon CodeBlanks

Bloc sınıfı

Bloc sınıfı ile event -> state akışını yönetmeyi öğrenirsin.

Bloc sınıfı nedir?

Bloc, event'leri state'lere dönüştüren sınıftır. Cubit'ten farkı, metot çağrısı yerine event nesneleriyle çalışmasıdır. Her event türü için on<Event> ile bir handler kaydedersin; handler emit ile yeni state üretir.

class CounterBloc extends Bloc<CounterEvent, CounterState> {
  CounterBloc() : super(CounterState(0)) {
    on<IncrementEvent>((event, emit) =>
      emit(CounterState(state.count + 1)));
  }
}

on<Event> ve emit

on<Event> ile bir event türü için handler kaydedersin. Handler iki parametre alır: event ve emit. emit(yeniState) çağrısı state'i günceller ve dinleyen widget'ları uyarır. emit yalnızca handler içinde çağrılabilir.

on<IncrementEvent>((event, emit) =>
  emit(CounterState(state.count + 1)));

Uygulama CounterBloc sınıfı yaz

CounterBloc adında, Bloc<CounterEvent, CounterState> türeten bir sınıf yaz. Başlangıç değeri 0 olsun. IncrementEvent işleyicisi sayacı 1 artırsın. main içinde örnek oluştur, iki kez event ekle, bekle ve state.count'u yazdır.

Başlangıç kodu

main.dart
import 'package:bloc/bloc.dart';

class CounterEvent {}
class IncrementEvent extends CounterEvent {}
class CounterState {
  final int count;
  CounterState(this.count);
}

// CounterBloc sınıfını yaz
// Bloc<CounterEvent, CounterState> türet
// başlangıç değer 0 ile başlat
// IncrementEvent işleyicisi sayacı 1 artırsın

void main() async {
  // oluştur, iki kez event ekle, bekle, yazdır
}

Örnek çözüm

main.dart
import 'package:bloc/bloc.dart';

class CounterEvent {}
class IncrementEvent extends CounterEvent {}
class CounterState {
  final int count;
  CounterState(this.count);
}

class CounterBloc extends Bloc<CounterEvent, CounterState> {
  CounterBloc() : super(CounterState(0)) {
    on<IncrementEvent>((event, emit) =>
      emit(CounterState(state.count + 1)));
  }
}

void main() async {
  final bloc = CounterBloc();
  bloc.add(IncrementEvent());
  bloc.add(IncrementEvent());
  await Future.delayed(Duration(milliseconds: 10));
  print(bloc.state.count);
}

Beklenen çıktı

2

Soru ve cevaplar

Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.

1 Bloc ile Cubit arasındaki temel fark nedir?

  • Bloc event nesneleriyle, Cubit metot çağrılarıyla çalışır Doğru cevap
  • Bloc yalnızca async state tutar, Cubit sync tutar
  • Cubit event kullanır ama Bloc state tutmaz
  • İkisi tamamen aynıdır, yalnızca ad farklıdır

Açıklama: Bloc, event nesnelerini alıp state üretir; Cubit'te ise doğrudan metot çağrılır ve içinden emit yapılır.

2 emit çağrısı

Soru
on<IncrementEvent>((event, emit) => ____(CounterState(state.count + 1)));
Cevap
on<IncrementEvent>((event, emit) => emit(CounterState(state.count + 1)));

Açıklama: Handler içinde yeni state üretmek için emit çağrılır; add event eklemek için, state ise okumak için kullanılır.

3 Bloc parçaları

Kavram Anlamı
on<IncrementEvent> Event işleyici kaydı
emit State üretir
Bloc<Event, State> İki generic parametre
super(CounterState(0)) Başlangıç state

İleri seviye bölümündeki tüm dersler