Sparround

Cubit: emit və state axını

CubitBlocBase-dən miras alan, state-i metod çağırışları ilə dəyişən sinifdir. Konstruktorda ilkin state verilir, metodların içində emit() ilə yeni state yayımlanır.

Əsas qaydalar:

  • state — cari state-ə sinxron çıxış.
  • emit(newState) — yeni state yayımlayır. Yalnız cubit-in içindən çağırılır; kənardan state dəyişdirmək mümkün deyil, bu, məqsədli məhdudiyyətdir.
  • Rəsmi sənədin xəbərdarlığı: bloc və cubit təkrar state-ləri nəzərə almırstate == nextState olduqda heç bir dəyişiklik baş vermir.
  • close() — cubit-in ömrünün sonu; BlocProvider bunu avtomatik çağırır.
dart
class WeatherState {
  const WeatherState({
    this.isLoading = false,
    this.weather,
    this.error,
  });

  final bool isLoading;
  final Weather? weather;
  final String? error;

  WeatherState copyWith({bool? isLoading, Weather? weather, String? error}) =>
      WeatherState(
        isLoading: isLoading ?? this.isLoading,
        weather: weather ?? this.weather,
        error: error,
      );
}

class WeatherCubit extends Cubit<WeatherState> {
  WeatherCubit(this._repository) : super(const WeatherState());

  final WeatherRepository _repository;

  Future<void> load(String city) async {
    emit(state.copyWith(isLoading: true, error: null));
    try {
      final weather = await _repository.fetch(city);
      emit(state.copyWith(isLoading: false, weather: weather));
    } catch (error) {
      emit(state.copyWith(isLoading: false, error: '$error'));
    }
  }
}

Async iş görən cubit: yükləmə, nəticə və xəta.

Təkrar state qaydası praktikada iki üzlüdür. Faydası: eyni dəyər yenidən yayımlanarsa UI boş yerə rebuild olunmur. Tələsi: state sinfi == düzgün implementasiya etməyibsə (məsələn Equatable yoxdur və hər copyWith yeni obyektdir), hər emit "yeni" sayılır və filtr işləmir; əksinə, mutable sahəni yerində dəyişib eyni obyekti emit edərsəniz, == fərq görmür və UI heç vaxt yenilənmir.

CubitBloc
State metod çağırışı ilə dəyişirState event ilə dəyişir
Daha az kod: event sinifləri yoxdurDaha çox kod, lakin hər dəyişikliyin adı var
Nəyin state-i dəyişdirdiyi çağırış yerindən görünür`onTransition` bütün zənciri qeyd edir (state → event → state)
Reaktiv operatorlar (debounce, throttle) əl ilə yazılır`EventTransformer` ilə hazır dəstək

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