flutter_telescope 1.0.3
flutter_telescope: ^1.0.3 copied to clipboard
A powerful Flutter package for network activity monitoring and debugging with beautiful UI and comprehensive logging.
example/lib/main.dart
import 'package:flutter/material.dart';
import 'package:dio/dio.dart';
import 'package:flutter_telescope/flutter_telescope.dart';
void main() {
WidgetsFlutterBinding.ensureInitialized();
NetworkInspector.initialize();
// Enable the floating test button with custom configuration
NetworkInspectorConfig.enableTestButton(
alignment: Alignment.bottomRight,
margin: 20.0,
customButton: const Icon(Icons.bug_report_sharp, color: Colors.white),
);
runApp(const ExampleApp());
}
class ExampleApp extends StatelessWidget {
const ExampleApp({super.key});
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Telescope Example',
navigatorKey: NavigationService.navigatorKey,
theme: ThemeData(
primarySwatch: Colors.blue,
useMaterial3: true,
colorScheme: ColorScheme.fromSeed(
seedColor: Colors.blue,
brightness: Brightness.light,
),
),
debugShowCheckedModeBanner: false,
home: const NetworkInspectorOverlay(child: ExampleHomePage()),
);
}
}
class ExampleHomePage extends StatefulWidget {
const ExampleHomePage({super.key});
@override
State<ExampleHomePage> createState() => _ExampleHomePageState();
}
class _ExampleHomePageState extends State<ExampleHomePage> {
late Dio _dioClient;
bool _isLoading = false;
String _lastResponse = '';
@override
void initState() {
super.initState();
_setupDioClient();
}
void _setupDioClient() {
_dioClient = Dio();
_dioClient.interceptors.add(
DioInterceptor(
networkInspector: NetworkInspector(),
logIsAllowed: true,
isConsoleLogAllowed: true,
),
);
// Set base URL for testing
_dioClient.options.baseUrl = 'https://jsonplaceholder.typicode.com';
}
Future<void> _makeGetRequest() async {
setState(() {
_isLoading = true;
_lastResponse = '';
});
try {
final response = await _dioClient.get('/posts/1');
setState(() {
_lastResponse = 'GET Request Success:\n${response.data}';
});
} catch (e) {
setState(() {
_lastResponse = 'GET Request Error:\n$e';
});
} finally {
setState(() {
_isLoading = false;
});
}
}
Future<void> _makePostRequest() async {
setState(() {
_isLoading = true;
_lastResponse = '';
});
try {
final response = await _dioClient.post(
'/posts',
data: {
'title': 'Flutter Telescope Test',
'body': 'This is a test post from flutter_telescope example',
'userId': 1,
},
);
setState(() {
_lastResponse = 'POST Request Success:\n${response.data}';
});
} catch (e) {
setState(() {
_lastResponse = 'POST Request Error:\n$e';
});
} finally {
setState(() {
_isLoading = false;
});
}
}
Future<void> _makeErrorRequest() async {
setState(() {
_isLoading = true;
_lastResponse = '';
});
try {
final response = await _dioClient.get('/nonexistent-endpoint');
setState(() {
_lastResponse = 'Unexpected Success:\n${response.data}';
});
} catch (e) {
setState(() {
_lastResponse = 'Expected Error:\n$e';
});
} finally {
setState(() {
_isLoading = false;
});
}
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text(
'Flutter Telescope',
style: TextStyle(fontWeight: FontWeight.bold),
),
backgroundColor: Theme.of(context).colorScheme.primary,
foregroundColor: Colors.white,
elevation: 2,
actions: [
IconButton(
icon: const Icon(Icons.list_alt),
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => const ActivityPage()),
);
},
tooltip: 'View Network Activities',
),
],
),
body: SingleChildScrollView(
child: Padding(
padding: const EdgeInsets.all(16),
child: Column(
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
// Header Card
Container(
decoration: BoxDecoration(
gradient: LinearGradient(
colors: [
Theme.of(context).colorScheme.primary,
Theme.of(context).colorScheme.primaryContainer,
],
begin: Alignment.topLeft,
end: Alignment.bottomRight,
),
borderRadius: BorderRadius.circular(16),
boxShadow: [
BoxShadow(
color: Colors.black.withValues(alpha: 0.1),
blurRadius: 8,
offset: const Offset(0, 4),
),
],
),
child: Padding(
padding: const EdgeInsets.all(20),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: [
Icon(
Icons.network_check,
color: Colors.white,
size: 32,
),
const SizedBox(width: 12),
const Expanded(
child: Text(
'Flutter Telescope',
style: TextStyle(
fontSize: 28,
fontWeight: FontWeight.bold,
color: Colors.white,
),
),
),
],
),
const SizedBox(height: 12),
const Text(
'Network monitoring and debugging made simple',
style: TextStyle(fontSize: 16, color: Colors.white70),
),
const SizedBox(height: 20),
const Text(
'Key Features:',
style: TextStyle(
fontSize: 18,
fontWeight: FontWeight.bold,
color: Colors.white,
),
),
const SizedBox(height: 12),
...[
'🌐 Network activity monitoring',
'📊 Request/response logging',
'🎨 Beautiful UI for debugging',
'🐛 Error tracking',
'🔍 Floating test button',
].map(
(feature) => Padding(
padding: const EdgeInsets.symmetric(vertical: 4),
child: Text(
feature,
style: const TextStyle(
color: Colors.white70,
fontSize: 14,
),
),
),
),
],
),
),
),
const SizedBox(height: 24),
// Test Section
Container(
decoration: BoxDecoration(
color: Theme.of(context).colorScheme.surface,
borderRadius: BorderRadius.circular(16),
border: Border.all(
color: Theme.of(
context,
).colorScheme.outline.withValues(alpha: 0.2),
),
),
child: Padding(
padding: const EdgeInsets.all(20),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'Test Network Requests',
style: TextStyle(
fontSize: 20,
fontWeight: FontWeight.bold,
color: Theme.of(context).colorScheme.onSurface,
),
),
const SizedBox(height: 8),
Text(
'Try different network operations to see the telescope in action',
style: TextStyle(
color: Theme.of(context).colorScheme.onSurfaceVariant,
),
),
const SizedBox(height: 20),
if (_isLoading)
Center(
child: Column(
children: [
CircularProgressIndicator(
color: Theme.of(context).colorScheme.primary,
),
const SizedBox(height: 16),
Text(
'Making request...',
style: TextStyle(
color: Theme.of(
context,
).colorScheme.onSurfaceVariant,
),
),
],
),
)
else ...[
// GET Request Button
SizedBox(
width: double.infinity,
height: 50,
child: ElevatedButton(
onPressed: _makeGetRequest,
style: ElevatedButton.styleFrom(
backgroundColor: Theme.of(
context,
).colorScheme.primary,
foregroundColor: Colors.white,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12),
),
elevation: 2,
),
child: const Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(Icons.download),
SizedBox(width: 8),
Text(
'Make GET Request',
style: TextStyle(fontWeight: FontWeight.bold),
),
],
),
),
),
const SizedBox(height: 12),
// POST Request Button
SizedBox(
width: double.infinity,
height: 50,
child: ElevatedButton(
onPressed: _makePostRequest,
style: ElevatedButton.styleFrom(
backgroundColor: Theme.of(
context,
).colorScheme.secondary,
foregroundColor: Colors.white,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12),
),
elevation: 2,
),
child: const Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(Icons.upload),
SizedBox(width: 8),
Text(
'Make POST Request',
style: TextStyle(fontWeight: FontWeight.bold),
),
],
),
),
),
const SizedBox(height: 12),
// Error Request Button
SizedBox(
width: double.infinity,
height: 50,
child: ElevatedButton(
onPressed: _makeErrorRequest,
style: ElevatedButton.styleFrom(
backgroundColor: Colors.red,
foregroundColor: Colors.white,
shape: RoundedRectangleBorder(
borderRadius: BorderRadius.circular(12),
),
elevation: 2,
),
child: const Row(
mainAxisAlignment: MainAxisAlignment.center,
children: [
Icon(Icons.error_outline),
SizedBox(width: 8),
Text(
'Make Error Request',
style: TextStyle(fontWeight: FontWeight.bold),
),
],
),
),
),
],
],
),
),
),
const SizedBox(height: 24),
// Response Section
if (_lastResponse.isNotEmpty)
Container(
decoration: BoxDecoration(
color: Theme.of(context).colorScheme.surface,
borderRadius: BorderRadius.circular(16),
border: Border.all(
color: Theme.of(
context,
).colorScheme.outline.withValues(alpha: 0.2),
),
),
child: Padding(
padding: const EdgeInsets.all(20),
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Row(
children: [
Icon(
Icons.data_object,
color: Theme.of(context).colorScheme.primary,
),
const SizedBox(width: 8),
Text(
'Response',
style: TextStyle(
fontSize: 18,
fontWeight: FontWeight.bold,
color: Theme.of(
context,
).colorScheme.onSurfaceVariant,
),
),
],
),
const SizedBox(height: 12),
Container(
width: double.infinity,
padding: const EdgeInsets.all(12),
decoration: BoxDecoration(
color: Theme.of(context).colorScheme.surface,
borderRadius: BorderRadius.circular(8),
border: Border.all(
color: Theme.of(
context,
).colorScheme.outline.withValues(alpha: 0.1),
),
),
child: Text(
_lastResponse,
style: TextStyle(
fontFamily: 'monospace',
fontSize: 12,
color: Theme.of(context).colorScheme.onSurface,
),
),
),
],
),
),
),
],
),
),
),
);
}
}