repository and data provider concept
This commit is contained in:
@ -1,25 +0,0 @@
|
||||
import 'package:hydrated_bloc/hydrated_bloc.dart';
|
||||
|
||||
import '../repository/repository.dart';
|
||||
import 'loadable_state.dart';
|
||||
|
||||
sealed class LoadableHydratedBlocEvent {}
|
||||
class DataRecieved extends LoadableHydratedBlocEvent {}
|
||||
|
||||
abstract class LoadableHydratedBloc<TEvent, TState> extends HydratedBloc<TEvent, LoadableState<TState>> {
|
||||
LoadableHydratedBloc() : super(const LoadableState()) {
|
||||
repository().load();
|
||||
|
||||
}
|
||||
|
||||
Repository repository();
|
||||
|
||||
|
||||
@override
|
||||
fromJson(Map<String, dynamic> json) => LoadableState(isLoading: true, data: fromStorage(json));
|
||||
@override
|
||||
Map<String, dynamic>? toJson(state) => state.data.toJson();
|
||||
|
||||
TState fromStorage(Map<String, dynamic> json);
|
||||
Map<String, dynamic>? toStorage(TState state);
|
||||
}
|
@ -1,14 +1,14 @@
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import 'loadable_state_consumer.dart';
|
||||
|
||||
class LoadableStateBackgroundLoading extends StatelessWidget {
|
||||
final bool visible;
|
||||
const LoadableStateBackgroundLoading({required this.visible, super.key});
|
||||
|
||||
final Duration animationDuration = const Duration(milliseconds: 200);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) => AnimatedSwitcher(
|
||||
duration: animationDuration,
|
||||
duration: LoadableStateConsumer.animationDuration,
|
||||
transitionBuilder: (Widget child, Animation<double> animation) => SlideTransition(
|
||||
position: Tween<Offset>(
|
||||
begin: const Offset(0.0, -1.0),
|
||||
|
@ -2,36 +2,36 @@ import 'package:bloc/bloc.dart';
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:provider/provider.dart';
|
||||
|
||||
import '../../utilityWidgets/loadableHydratedBloc/loadable_hydrated_bloc_event.dart';
|
||||
import '../loadable_state.dart';
|
||||
import 'loadable_state_background_loading.dart';
|
||||
import 'loadable_state_error_bar.dart';
|
||||
import 'loadable_state_primary_loading.dart';
|
||||
|
||||
// TODO might be a simpler way
|
||||
class LoadableStateConsumer<TController extends Bloc<dynamic, TWrappedState>, TWrappedState extends LoadableState<TState>, TState> extends StatelessWidget {
|
||||
final Widget Function(TState state) child;
|
||||
class LoadableStateConsumer<TController extends Bloc<LoadableHydratedBlocEvent<TState>, LoadableState<TState>>, TState> extends StatelessWidget {
|
||||
final Widget Function(TState state, bool loading) child;
|
||||
const LoadableStateConsumer({required this.child, super.key});
|
||||
|
||||
static Duration animationDuration = const Duration(milliseconds: 200);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
var state = context.read<TController>().state as LoadableState<TState>;
|
||||
var loadableState = context.watch<TController>().state;
|
||||
|
||||
return Column(
|
||||
children: [
|
||||
LoadableStateErrorBar(visible: state.showError()),
|
||||
LoadableStateErrorBar(visible: loadableState.showError()),
|
||||
Expanded(
|
||||
child: Stack(
|
||||
children: [
|
||||
LoadableStatePrimaryLoading(visible: state.showPrimaryLoading()),
|
||||
LoadableStateBackgroundLoading(visible: state.showBackgroundLoading()),
|
||||
LoadableStatePrimaryLoading(visible: loadableState.showPrimaryLoading()),
|
||||
LoadableStateBackgroundLoading(visible: loadableState.showBackgroundLoading()),
|
||||
|
||||
AnimatedOpacity(
|
||||
opacity: state.showContent() ? 1.0 : 0.0,
|
||||
opacity: loadableState.showContent() ? 1.0 : 0.0,
|
||||
duration: animationDuration,
|
||||
curve: Curves.easeInOut,
|
||||
child: state.showContent() ? child(state.data) : const SizedBox.shrink()
|
||||
child: loadableState.showContent() ? child(loadableState.data, loadableState.isLoading) : const SizedBox.shrink()
|
||||
),
|
||||
],
|
||||
),
|
||||
|
@ -1,7 +1,7 @@
|
||||
import 'package:flutter/material.dart';
|
||||
import 'package:flutter_bloc/flutter_bloc.dart';
|
||||
|
||||
import '../../utilityWidgets/bloc_providing_builder.dart';
|
||||
import '../../utilityWidgets/bloc_module.dart';
|
||||
import '../bloc/loadable_state_bloc.dart';
|
||||
import '../bloc/loadable_state_state.dart';
|
||||
|
||||
@ -12,7 +12,7 @@ class LoadableStateErrorBar extends StatelessWidget {
|
||||
final Duration animationDuration = const Duration(milliseconds: 200);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) => BlocProvidingBuilder<LoadableStateBloc, LoadableStateState>(
|
||||
Widget build(BuildContext context) => BlocModule<LoadableStateBloc, LoadableStateState>(
|
||||
create: (context) => LoadableStateBloc(),
|
||||
child: (context, state) => AnimatedSize(
|
||||
duration: animationDuration,
|
||||
|
@ -1,15 +1,15 @@
|
||||
import 'package:flutter/material.dart';
|
||||
|
||||
import 'loadable_state_consumer.dart';
|
||||
|
||||
class LoadableStatePrimaryLoading extends StatelessWidget {
|
||||
final bool visible;
|
||||
const LoadableStatePrimaryLoading({required this.visible, super.key});
|
||||
|
||||
final Duration animationDuration = const Duration(milliseconds: 200);
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) => AnimatedOpacity(
|
||||
opacity: visible ? 1.0 : 0.0,
|
||||
duration: animationDuration,
|
||||
duration: LoadableStateConsumer.animationDuration,
|
||||
curve: Curves.easeInOut,
|
||||
child: const Center(child: CircularProgressIndicator()),
|
||||
);
|
||||
|
Reference in New Issue
Block a user