cyber_req 2.0.12+1
cyber_req: ^2.0.12+1 copied to clipboard
A flexible Flutter/Dart API client for backends with dynamic headers, secure token management, and comprehensive callbacks.
example/main.dart
import 'package:flutter/material.dart';
import 'package:cyber_req/cyber_req.dart';
void main() {
runApp(const MyApp());
}
class MyApp extends StatelessWidget {
const MyApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Cyber Req Examples',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: const ExampleScreen(),
);
}
}
class ExampleScreen extends StatefulWidget {
const ExampleScreen({super.key});
@override
State<ExampleScreen> createState() => _ExampleScreenState();
}
class _ExampleScreenState extends State<ExampleScreen> {
final ApiService _apiService = ApiService(
baseUrl: 'https://jsonplaceholder.typicode.com',
onUnauthorized: () async {
// Simulate token refresh or logout
debugPrint('Unauthorized! Attempting to refresh token or logging out...');
await Future.delayed(const Duration(seconds: 1));
debugPrint('Unauthorized handler finished.');
},
);
String _example1Result = 'Loading...';
String _example2Result = 'Loading...';
String _example3Result = 'Loading...';
@override
void initState() {
super.initState();
_runExample1();
_runExample2();
_runExample3();
}
// Example 1: Basic GET Request with Callbacks
Future<void> _runExample1() async {
setState(() => _example1Result = 'Fetching data for Example 1...');
try {
await _apiService.get(
'/todos/1',
onSuccess: (data, {statusCode}) {
setState(() => _example1Result = 'Example 1 Success: ${data['title']} (Status: $statusCode)');
},
onFailure: (error, {statusCode}) {
setState(() => _example1Result = 'Example 1 Failure: ${error.message} (Status: $statusCode)');
},
);
} catch (e) {
setState(() => _example1Result = 'Example 1 Error: $e');
}
}
// Example 2: GET Request with Bearer Token (Simulated Unauthorized)
Future<void> _runExample2() async {
setState(() => _example2Result = 'Fetching data for Example 2 (simulating unauthorized)...');
try {
// Using a fake token to trigger unauthorized handler if API supports it
await _apiService.get(
'/posts', // Using a different endpoint for variety
bearerToken: 'fake_invalid_token',
onSuccess: (data, {statusCode}) {
setState(() => _example2Result = 'Example 2 Success: ${data.length} items (Status: $statusCode)');
},
onFailure: (error, {statusCode}) {
setState(() => _example2Result = 'Example 2 Failure: ${error.message} (Status: $statusCode)');
},
);
} catch (e) {
setState(() => _example2Result = 'Example 2 Error: $e');
}
}
// Example 3: POST Request with Data and Callbacks
Future<void> _runExample3() async {
setState(() => _example3Result = 'Posting data for Example 3...');
try {
await _apiService.post(
'/posts',
data: {'title': 'foo', 'body': 'bar', 'userId': 1},
onSuccess: (data, {statusCode}) {
setState(() => _example3Result = 'Example 3 Success: Post ID ${data['id']} (Status: $statusCode)');
},
onFailure: (error, {statusCode}) {
setState(() => _example3Result = 'Example 3 Failure: ${error.message} (Status: $statusCode)');
},
);
} catch (e) {
setState(() => _example3Result = 'Example 3 Error: $e');
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Cyber Req Examples'),
),
body: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text('Example 1 (GET with Callbacks): $_example1Result'),
const SizedBox(height: 20),
Text('Example 2 (GET with Bearer Token & Unauthorized): $_example2Result'),
const SizedBox(height: 20),
Text('Example 3 (POST with Data & Callbacks): $_example3Result'),
],
),
),
);
}
}