import 'package:flutter_smart_dialog/flutter_smart_dialog.dart'; sealed class LoadingState { const LoadingState(); factory LoadingState.loading() => const Loading._internal(); bool get isSuccess => this is Success; T get data => switch (this) { Success(:final response) => response, _ => throw this, }; T? get dataOrNull => switch (this) { Success(:final response) => response, _ => null, }; Future toast() => SmartDialog.showToast(toString()); } class Loading extends LoadingState { const Loading._internal(); @override String toString() { return 'ApiException: loading'; } } 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 int? code; final String? errMsg; const Error(this.errMsg, {this.code}); @override bool operator ==(Object other) { if (identical(this, other)) { return true; } if (other is Error) { return errMsg == other.errMsg && code == other.code; } return false; } @override int get hashCode => Object.hash(errMsg, code); @override String toString() { return errMsg ?? code?.toString() ?? ''; } }