flutter_api_helper 1.0.0
flutter_api_helper: ^1.0.0 copied to clipboard
A powerful, easy-to-use API helper for Flutter that handles everything from simple GET requests to complex error handling, caching, and token management.
Flutter API Helper #
๐ A powerful, feature-rich HTTP client for Flutter applications
Built-in caching โข Smart retry logic โข Seamless widget integration
โจ Features Overview #

โ
Simple API - Intuitive methods for all HTTP operations |
โ
Network Aware - Built-in connectivity checking |
๐ฏ Why Choose Flutter API Helper? #
๐ Comparison | Built-in HTTP | Flutter API Helper |
---|---|---|
Setup | Complex boilerplate | โจ One-line configuration |
Caching | Manual implementation | ๐ง Smart auto-caching |
Retries | Custom retry logic | ๐ Exponential backoff |
Errors | Generic exceptions | ๐ก๏ธ Typed error handling |
Files | Complex multipart | ๐ Simple upload/download |
Widgets | Custom FutureBuilder | ๐ฏ Ready ApiBuilder |
๐ Quick Start #
Installation #
Add this to your package's pubspec.yaml
file:
dependencies:
flutter_api_helper: ^1.0.0
Then run:
flutter pub get
โก 30-Second Setup #
import 'package:flutter_api_helper/flutter_api_helper.dart';
void main() {
// ๐ง Configure once, use everywhere
ApiHelper.configure(
ApiConfig(
baseUrl: 'https://api.yourapp.com',
enableLogging: true,
timeout: Duration(seconds: 30),
// ๐ง Smart caching out of the box
cacheConfig: CacheConfig(duration: Duration(minutes: 5)),
// ๐ Auto-retry with exponential backoff
retryConfig: RetryConfig(maxRetries: 3),
),
);
runApp(MyApp());
}
๐ฑ Usage Examples #
๐ Basic HTTP Operations #
// GET request with automatic type casting
final users = await ApiHelper.get<List<User>>('/users');
// POST request with smart error handling
final newUser = await ApiHelper.post('/users', data: {
'name': 'John Doe',
'email': 'john@example.com',
});
// PUT request with caching
final updatedUser = await ApiHelper.put('/users/1',
data: {'name': 'Jane Doe'},
cache: CacheConfig(duration: Duration(minutes: 10)),
);
// DELETE request with retry logic
await ApiHelper.delete('/users/1',
retry: RetryConfig(maxRetries: 5),
);
๐ฏ Flutter Widget Integration #
Transform your UI with the ApiBuilder widget:
class UsersList extends StatelessWidget {
@override
Widget build(BuildContext context) {
return ApiBuilder<List<User>>(
future: ApiHelper.get('/users'),
builder: (users) => ListView.builder(
itemCount: users.length,
itemBuilder: (context, index) {
final user = users[index];
return ListTile(
leading: CircleAvatar(child: Text(user.name[0])),
title: Text(user.name),
subtitle: Text(user.email),
);
},
),
loading: Center(child: CircularProgressIndicator()),
error: (error) => ErrorWidget('Failed to load users: ${error.message}'),
empty: Center(child: Text('No users found')),
);
}
}
๐พ Smart Caching #
// ๐ง Cache response for 10 minutes
final posts = await ApiHelper.get(
'/posts',
cache: CacheConfig(duration: Duration(minutes: 10)),
);
// ๐๏ธ Clear cache when needed
await ApiHelper.clearCache();
await ApiHelper.clearCacheForUrl('/posts');
๐ Authentication & Token Management #
ApiHelper.configure(
ApiConfig(
baseUrl: 'https://api.yourapp.com',
// ๐ Automatic token injection
getToken: () async => await TokenStorage.getToken(),
// ๐ Automatic token refresh
onTokenExpired: () async => await AuthService.refreshToken(),
),
);
๐ File Operations with Progress #
// ๐ค Upload with real-time progress
final file = File('/path/to/image.jpg');
final response = await ApiHelper.uploadFile(
'/upload',
file,
fieldName: 'image',
fields: {'description': 'Profile picture'},
onProgress: (sent, total) {
final percentage = (sent / total * 100).round();
print('Upload Progress: $percentage%');
},
);
// ๐ฅ Download with progress tracking
await ApiHelper.downloadFile(
'/files/document.pdf',
'/local/path/document.pdf',
onProgress: (received, total) {
final percentage = (received / total * 100).round();
print('Download Progress: $percentage%');
},
);
๐ก๏ธ Advanced Error Handling #
try {
final data = await ApiHelper.get('/api/data');
// Handle success
} catch (e) {
if (e is ApiError) {
switch (e.type) {
case ApiErrorType.network:
showSnackBar('Check your internet connection');
break;
case ApiErrorType.server:
showSnackBar('Server is temporarily unavailable');
break;
case ApiErrorType.timeout:
showSnackBar('Request timed out. Please try again');
break;
case ApiErrorType.authentication:
redirectToLogin();
break;
default:
showSnackBar('Something went wrong: ${e.message}');
}
}
}
๐ Smart Retry with Exponential Backoff #
final data = await ApiHelper.get(
'/unstable-endpoint',
retry: RetryConfig(
maxRetries: 5,
retryDelay: Duration(seconds: 2),
useExponentialBackoff: true, // 2s, 4s, 8s, 16s, 32s
maxRetryDelay: Duration(seconds: 30),
),
);
๐ง Custom Interceptors #
class AuthInterceptor extends ApiInterceptor {
@override
Future<void> onRequest(String method, String url,
Map<String, String>? headers, dynamic data) async {
headers?['Authorization'] = 'Bearer ${await getToken()}';
headers?['User-Agent'] = 'MyApp/1.0';
}
@override
Future<void> onResponse(http.Response response) async {
if (response.statusCode == 401) {
await refreshToken();
}
// Log analytics
Analytics.trackApiCall(response.request?.url.toString());
}
}
// Add the interceptor
ApiHelper.instance.addInterceptor(AuthInterceptor());
โ๏ธ Configuration #
๐ ApiConfig Options #
ApiConfig(
baseUrl: 'https://api.example.com', // ๐ Base URL for all requests
defaultHeaders: {'Accept': 'application/json'}, // ๐ Default headers
timeout: Duration(seconds: 30), // โฑ๏ธ Request timeout
enableLogging: true, // ๐ Enable request/response logging
getToken: () async => 'your-token', // ๐ Token getter function
onTokenExpired: () async => refreshToken(), // ๐ Token refresh callback
onError: (error) => handleError(error), // ๐จ Global error handler
retryConfig: RetryConfig(...), // ๐ Default retry configuration
cacheConfig: CacheConfig(...), // ๐พ Default cache configuration
)
๐พ Cache Configuration #
CacheConfig(
duration: Duration(minutes: 5), // โฐ How long to cache responses
keyPrefix: 'myapp_', // ๐ท๏ธ Prefix for cache keys
useMemoryCache: true, // ๐ง Enable in-memory cache
useDiskCache: true, // ๐ฝ Enable persistent disk cache
maxCacheSize: 10 * 1024 * 1024, // ๐ Maximum cache size (10MB)
)
๐ Retry Configuration #
RetryConfig(
maxRetries: 3, // ๐ข Maximum retry attempts
retryDelay: Duration(seconds: 1), // โฑ๏ธ Initial delay between retries
useExponentialBackoff: true, // ๐ Use exponential backoff strategy
maxRetryDelay: Duration(seconds: 30), // โฐ Maximum delay between retries
retryStatusCodes: [408, 429, 500, 502, 503, 504], // ๐ HTTP status codes to retry
)
๐จ Error Types #
The package provides detailed error classification:
Error Type | Description | Common Causes |
---|---|---|
ApiErrorType.network |
Network connectivity issues | No internet, DNS issues |
ApiErrorType.timeout |
Request timeout errors | Slow connection, server overload |
ApiErrorType.server |
Server errors (5xx status codes) | Internal server error, maintenance |
ApiErrorType.client |
Client errors (4xx status codes) | Bad request, unauthorized |
ApiErrorType.authentication |
Authentication/authorization errors | Invalid token, expired session |
ApiErrorType.parsing |
JSON parsing errors | Malformed response, unexpected format |
ApiErrorType.unknown |
Unclassified errors | Unexpected exceptions |
๐งช Testing #
The package is designed to be testable. You can easily mock API responses:
void main() {
group('API Tests', () {
test('should fetch users successfully', () async {
// Mock your API calls here
final users = await ApiHelper.get<List<User>>('/users');
expect(users, isA<List<User>>());
expect(users.isNotEmpty, true);
});
test('should handle network errors gracefully', () async {
expect(
() => ApiHelper.get('/invalid-endpoint'),
throwsA(isA<ApiError>()),
);
});
});
}
๐ฑ Platform Support #
Platform | Status | Notes |
---|---|---|
Android | โ | Full support |
iOS | โ | Full support |
Web | โ | Full support |
macOS | โ | Full support |
Windows | โ | Full support |
Linux | โ | Full support |
๐ Requirements #
- Flutter:
>=3.0.0
- Dart:
>=2.17.0
๐ Examples #
For complete examples, check out the example folder which includes:
- ๐ Basic API operations
- ๐ Authentication flow
- ๐ File upload/download
- ๐พ Caching strategies
- ๐ก๏ธ Error handling patterns
- ๐ฏ Widget integration examples
๐ค Contributing #
We welcome contributions! Please see our Contributing Guide for details.
๐ ๏ธ Development Setup #
- ๐ด Fork the repository
- ๐ฟ Create your feature branch (
git checkout -b feature/amazing-feature
) - ๐พ Commit your changes (
git commit -m 'Add amazing feature'
) - ๐ค Push to the branch (
git push origin feature/amazing-feature
) - ๐ Open a Pull Request
๐ Changelog #
See CHANGELOG.md for a detailed history of changes.
๐ License #
This project is licensed under the MIT License - see the LICENSE file for details.
๐ Support & Community #
๐ Made with โค๏ธ for the Flutter community
If this package helped you, please consider giving it a โญ on GitHub!