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

@ -1,10 +1,10 @@
import 'package:flutter/material.dart';
import 'package:flutter_bloc/flutter_bloc.dart';
class BlocProvidingBuilder<TBloc extends StateStreamableSource<TState>, TState> extends StatelessWidget {
class BlocModule<TBloc extends StateStreamableSource<TState>, TState> extends StatelessWidget {
final TBloc Function(BuildContext context) create;
final Widget Function(BuildContext context, TState state) child;
const BlocProvidingBuilder({required this.create, required this.child, super.key});
const BlocModule({required this.create, required this.child, super.key});
@override
Widget build(BuildContext context) => BlocProvider<TBloc>(create: create, child: BlocBuilder<TBloc, TState>(builder: child));

@ -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);
}

@ -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> {}