Cubit: emit və state axını
Cubit — BlocBase-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ır —
state == nextStateolduqda heç bir dəyişiklik baş vermir. close()— cubit-in ömrünün sonu;BlocProviderbunu 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.
| Cubit | Bloc |
|---|---|
| State metod çağırışı ilə dəyişir | State event ilə dəyişir |
| Daha az kod: event sinifləri yoxdur | Daha ç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
- Bloc konseptləri: Cubitrəsmibloclibrary.dev
emit, təkrar state qaydası və Cubit/Bloc müqayisəsinin rəsmi mənbəyi.
- package:blocrəsmipub.dev
- Niyə Bloc?rəsmibloclibrary.dev