abstract class LoadingState { const LoadingState(); factory LoadingState.loading() = Loading; factory LoadingState.success(T response) = Success; factory LoadingState.error(String errMsg) = Error; } class Loading extends LoadingState { Loading._internal(); static final Loading _instance = Loading._internal(); factory Loading() => _instance; } class Success extends LoadingState { final T response; const Success(this.response); @override bool operator ==(Object other) { if (identical(this, other)) { return true; } if (other is Success) { return response == other.response; } return false; } @override int get hashCode => response.hashCode; } class Error extends LoadingState { final String errMsg; const Error(this.errMsg); @override bool operator ==(Object other) { if (identical(this, other)) { return true; } if (other is Error) { return errMsg == other.errMsg; } return false; } @override int get hashCode => errMsg.hashCode; }