import 'dart:async'; import 'package:bloc/bloc.dart'; import '../../tools/tools.dart'; import '../init.dart'; import '../../veilid_support/veilid_support.dart'; abstract class AsyncTableDBBackedCubit extends Cubit> with TableDBBacked { AsyncTableDBBackedCubit() : super(const AsyncValue.loading()) { unawaited(Future.delayed(Duration.zero, _build)); } Future _build() async { try { await eventualVeilid.future; emit(AsyncValue.data(await load())); } on Exception catch (e, stackTrace) { emit(AsyncValue.error(e, stackTrace)); } } Future readyData() async { final stateStream = stream.distinct(); await for (final AsyncValue av in stateStream) { final d = av.when( data: (value) => value, loading: () => null, error: (e, s) => null); if (d != null) { return d; } final ef = av.when( data: (value) => null, loading: () => null, error: Future.error); if (ef != null) { return ef; } } return Future.error( StateError("data never became ready in cubit '$runtimeType'")); } Future setState(State newState) async { try { emit(AsyncValue.data(await store(newState))); } on Exception catch (e, stackTrace) { emit(AsyncValue.error(e, stackTrace)); } } }