executeAndEmit<T> method

Future<T?> executeAndEmit<T>(
  1. Future<T> requestFn(), {
  2. required void emit(
    1. NetworkState
    ),
  3. String? cacheKey,
  4. NetworkStrategy? strategy,
  5. Duration? cacheTtl,
})

Execute a request and pipe NetworkState changes into emit.

This is designed to be called from a Bloc event handler or Cubit method:

class UserCubit extends Cubit<NetworkState> {
  UserCubit(this._manager) : super(const Idle());

  final NetworkManager _manager;

  Future<void> loadUser() async {
    await _manager.executeAndEmit(
      () => api.getUser(),
      emit: emit,
      cacheKey: 'user',
      strategy: CacheFirst(),
    );
  }
}

Implementation

Future<T?> executeAndEmit<T>(
  Future<T> Function() requestFn, {
  required void Function(NetworkState) emit,
  String? cacheKey,
  NetworkStrategy? strategy,
  Duration? cacheTtl,
}) async {
  emit(const Loading());

  try {
    final data = await request<T>(
      requestFn,
      cacheKey: cacheKey,
      strategy: strategy,
      cacheTtl: cacheTtl,
    );
    emit(Success<T>(data));
    return data;
  } catch (e) {
    if (!isOnline) {
      emit(Offline(queuedRequests: queue.length));
    } else {
      emit(Error(e.toString(), exception: e));
    }
    return null;
  }
}