class LoadableState { final LoadingState loadingState; final TState? data; const LoadableState({required this.loadingState, required this.data}); LoadableState loading() => LoadableState(loadingState: LoadingState.loading, data: null); LoadableState cached(TState state) => LoadableState(loadingState: LoadingState.loading, data: state); LoadableState done(TState state) => LoadableState(loadingState: LoadingState.none, data: state); LoadableState error({TState? state}) => LoadableState(loadingState: LoadingState.failed, data: state); bool isBackgroundLoading() => loadingState == LoadingState.loading && data != null; bool hasError() => loadingState == LoadingState.failed; bool hasStateData() => data != null; bool errorBarVisible() => hasError() && hasStateData(); } enum LoadingState { loading, failed, none, }