repository and data provider concept

This commit is contained in:
2024-05-07 22:15:56 +02:00
parent 6ad8203b6a
commit b171fef348
14 changed files with 129 additions and 104 deletions

View File

@ -0,0 +1,31 @@
import 'package:hydrated_bloc/hydrated_bloc.dart';
import '../../repository/repository.dart';
import 'loadable_hydrated_bloc_event.dart';
import '../../loadableState/loadable_state.dart';
abstract class LoadableHydratedBloc<TEvent extends LoadableHydratedBlocEvent<TState>, TState, TRepository extends Repository<TState>> extends HydratedBloc<LoadableHydratedBlocEvent<TState>, LoadableState<TState>> {
late TRepository _repository;
LoadableHydratedBloc() : super(const LoadableState()) {
on<Emit<TState>>((event, emit) => emit(LoadableState(isLoading: event.loading, data: event.state(innerState ?? fromNothing()))));
on<ClearState<TState>>((event, emit) => emit(const LoadableState()));
_repository = repository();
loadState();
}
TState? get innerState => state.data;
TRepository get repo => _repository;
@override
fromJson(Map<String, dynamic> json) => LoadableState(isLoading: true, data: fromStorage(json));
@override
Map<String, dynamic>? toJson(LoadableState<TState> state) => state.data == null ? {} : state.data.toJson();
Future<void> loadState();
TRepository repository();
TState fromNothing();
TState fromStorage(Map<String, dynamic> json);
Map<String, dynamic>? toStorage(TState state);
}

View File

@ -0,0 +1,7 @@
class LoadableHydratedBlocEvent<TState> {}
class Emit<TState> extends LoadableHydratedBlocEvent<TState> {
final TState Function(TState state) state;
final bool loading;
Emit(this.state, {this.loading = false});
}
class ClearState<TState> extends LoadableHydratedBlocEvent<TState> {}