client_network_manager 1.0.4
client_network_manager: ^1.0.4 copied to clipboard
A comprehensive Flutter network manager package with authentication, interceptors, and error handling support.
example/lib/main.dart
import 'package:client_network_manager/client_network_manager.dart';
import 'package:flutter/material.dart';
import 'package:flutter_shared_utilities/flutter_shared_utilities.dart';
import 'pages/network_demo_page.dart';
import 'services/connectivity_service.dart';
import 'services/example_network_service.dart';
import 'services/logger_service.dart';
void main() {
runApp(const ClientNetworkManagerExampleApp());
}
class ClientNetworkManagerExampleApp extends StatelessWidget {
const ClientNetworkManagerExampleApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Client Network Manager Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
useMaterial3: true,
colorScheme: ColorScheme.fromSeed(
seedColor: Colors.blue,
brightness: Brightness.light,
),
),
home: const NetworkManagerSetupPage(),
);
}
}
class NetworkManagerSetupPage extends StatefulWidget {
const NetworkManagerSetupPage({super.key});
@override
State<NetworkManagerSetupPage> createState() =>
_NetworkManagerSetupPageState();
}
class _NetworkManagerSetupPageState extends State<NetworkManagerSetupPage> {
late final DefaultBaseNetworkManager _networkManager;
late final RealApiNetworkService _networkService;
late final AppLogger _logger;
late final ConnectivityService _connectivityService;
@override
void initState() {
super.initState();
_initializeServices();
}
void _initializeServices() {
// Initialize logger service
_logger = ExampleLoggerService();
// Initialize connectivity service
_connectivityService = ExampleConnectivityService();
// Initialize network manager with JSONPlaceholder API
_networkManager = DefaultBaseNetworkManager(
_logger,
_connectivityService,
baseUrl: 'https://jsonplaceholder.typicode.com',
timeoutSeconds: 30,
);
// Initialize network service
_networkService = RealApiNetworkService(_networkManager);
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Network Manager Demo'),
backgroundColor: Theme.of(context).colorScheme.inversePrimary,
),
body: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
Card(
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'Network Manager Configuration',
style: Theme.of(context).textTheme.headlineSmall
?.copyWith(fontWeight: FontWeight.bold),
),
const SizedBox(height: 12),
_buildConfigInfo(
'Base URL',
'https://jsonplaceholder.typicode.com',
),
_buildConfigInfo('Timeout', '30 seconds'),
_buildConfigInfo('Content Type', 'application/json'),
const SizedBox(height: 16),
Text(
'Active Interceptors:',
style: Theme.of(context).textTheme.titleMedium?.copyWith(
fontWeight: FontWeight.bold,
),
),
const SizedBox(height: 8),
const Text('• Custom Log Interceptor'),
const Text('• Connectivity Interceptor'),
const Text('• Background Transformers'),
],
),
),
),
const SizedBox(height: 16),
Card(
child: Padding(
padding: const EdgeInsets.all(16.0),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'Available Demonstrations',
style: Theme.of(context).textTheme.headlineSmall
?.copyWith(fontWeight: FontWeight.bold),
),
const SizedBox(height: 12),
const Text(
'• GET requests with and without authentication',
),
const Text('• POST requests with JSON body'),
const Text('• PUT requests for updates'),
const Text('• DELETE requests'),
const Text('• Error handling scenarios'),
const Text('• Custom headers management'),
const Text('• Query parameters'),
const Text('• Network connectivity checking'),
],
),
),
),
const SizedBox(height: 24),
ElevatedButton(
onPressed: () => _navigateToDemo(),
style: ElevatedButton.styleFrom(
padding: const EdgeInsets.symmetric(vertical: 16),
backgroundColor: Theme.of(context).colorScheme.primary,
foregroundColor: Theme.of(context).colorScheme.onPrimary,
),
child: Text(
'Start Network Demo',
style: Theme.of(context).textTheme.titleMedium?.copyWith(
fontWeight: FontWeight.bold,
color: Theme.of(context).colorScheme.onPrimary,
),
),
),
const SizedBox(height: 16),
OutlinedButton(
onPressed: () => _showNetworkManagerInfo(),
child: const Text('View Network Manager Details'),
),
],
),
),
);
}
Widget _buildConfigInfo(String label, String value) {
return Padding(
padding: const EdgeInsets.symmetric(vertical: 4),
child: Row(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
SizedBox(
width: 100,
child: Text(
'$label:',
style: const TextStyle(fontWeight: FontWeight.w500),
),
),
Expanded(
child: Text(value, style: TextStyle(color: Colors.grey[700])),
),
],
),
);
}
void _navigateToDemo() {
Navigator.of(context).push(
MaterialPageRoute(
builder: (context) => NetworkDemoPage(
networkService: _networkService,
networkManager: _networkManager,
),
),
);
}
void _showNetworkManagerInfo() {
showDialog(
context: context,
builder: (context) => AlertDialog(
title: const Text('Network Manager Information'),
content: SingleChildScrollView(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
mainAxisSize: MainAxisSize.min,
children: [
const Text(
'Headers:',
style: TextStyle(fontWeight: FontWeight.bold),
),
const SizedBox(height: 8),
Text(_networkManager.allHeaders.toString()),
const SizedBox(height: 16),
const Text(
'Interceptors:',
style: TextStyle(fontWeight: FontWeight.bold),
),
const SizedBox(height: 8),
Text('Count: ${_networkManager.allInterceptors.length}'),
const SizedBox(height: 8),
...(_networkManager.allInterceptors.map(
(interceptor) => Text('• ${interceptor.runtimeType}'),
)),
],
),
),
actions: [
TextButton(
onPressed: () => Navigator.of(context).pop(),
child: const Text('Close'),
),
],
),
);
}
}