network_info 2.0.0
network_info: ^2.0.0 copied to clipboard
A standalone Flutter package for retrieving network information (public and local IP addresses)
Network Info Package #
A standalone Flutter package for retrieving network information including public and local IP addresses.
β¨ Simple & Clean API!
Features #
- π Get public IP address (visible on the internet)
- π Get local IP address (LAN/Wi-Fi)
- π Multiple fallback services for reliability
- β‘ Auto-initialization - No manual DI setup required
- π― Simple unified API - One-line access to all features
- π§ͺ Fully tested with 100+ test cases
- ποΈ Clean Architecture with SOLID principles
- π Dependency injection support with GetIt
- π― Type-safe with strong typing
- π¦ Zero dependencies on other custom packages
Installation #
Add to your pubspec.yaml:
dependencies:
network_info:
path: packages/network_info
Quick Start (Recommended) #
The simplest way to use this package:
import 'package:network_info/network_info.dart';
// No initialization needed! Auto-initializes on first use
// Get public IP
final publicIp = await NetworkInfo.getPublicIp();
print('Public IP: $publicIp');
// Get local IP
final localIp = await NetworkInfo.getLocalIp();
print('Local IP: $localIp');
// Check connectivity
final isConnected = await NetworkInfo.isConnected();
print('Connected: $isConnected');
// Get all info at once (more efficient)
final info = await NetworkInfo.getNetworkInfo();
print('Public: ${info.publicIp}, Local: ${info.localIp}, Connected: ${info.isConnected}');
With Custom Configuration (Optional) #
import 'package:network_info/network_info.dart';
void main() {
// Optional: customize before first use
NetworkInfo.initialize(
config: NetworkInfoConfig(
timeout: Duration(seconds: 10),
retryCount: 5,
),
);
runApp(MyApp());
}
Advanced Usage (Direct DI Access) #
For advanced scenarios, you can still access the repository directly:
1. Setup Dependency Injection #
import 'package:network_info/network_info.dart';
void main() {
// Initialize the package
NetworkInfoDI.setupNetworkInfoDI();
runApp(MyApp());
}
2. Use Repository Interface #
import 'package:get_it/get_it.dart';
import 'package:network_info/network_info.dart';
final locator = GetIt.instance;
Future<void> getNetworkInfo() async {
final networkInfo = locator<INetworkInfoRepository>();
// Get public IP
final publicIp = await networkInfo.getPublicIp();
print('Public IP: $publicIp');
// Get local IP
final localIp = await networkInfo.getLocalIp();
print('Local IP: $localIp');
// Get network info model
final info = await networkInfo.getNetworkInfo();
print('Public: ${info.publicIp}, Local: ${info.localIp}');
}
Architecture #
This package follows Clean Architecture and SOLID principles with clear separation of concerns:
lib/
βββ src/
β βββ domain/ # Business logic layer (pure Dart)
β β βββ models/
β β β βββ network_info_model.dart
β β βββ repository/
β β β βββ i_network_info_repository.dart
β β βββ exceptions/
β β βββ network_info_exception.dart
β β
β βββ data/ # Data layer (implementation)
β β βββ config/
β β β βββ network_info_config.dart
β β βββ data_sources/
β β β βββ public_ip_data_source.dart
β β β βββ local_ip_data_source.dart
β β β βββ connectivity_data_source.dart
β β βββ repository/
β β βββ network_info_repository_impl.dart
β β
β βββ di/ # Dependency injection
β βββ network_info_di.dart
β
βββ network_info.dart # Public API
SOLID Principles Applied #
- Single Responsibility: Each class has one clear responsibility
- Open/Closed: Easy to extend without modifying existing code
- Liskov Substitution: All implementations can be substituted with their interfaces
- Interface Segregation: Focused interfaces with only necessary methods
- Dependency Inversion: High-level modules depend on abstractions
Design Patterns Used #
- Facade Pattern: Simplified interface hiding system complexity (NetworkInfo)
- Repository Pattern: Abstracts data source details
- Dependency Injection: For better testability and flexibility
- Strategy Pattern: Multiple implementations for different scenarios
- Singleton Pattern: Single instance management via GetIt
Why Use This Package? #
This package provides a simplified interface to network information. Benefits include:
- β Simpler API: One line of code instead of multiple DI setup steps
- β Auto-initialization: No manual setup required
- β Less boilerplate: No need to manage GetIt or repository instances
- β
Clearer intent:
NetworkInfo.getPublicIp()is self-documenting - β Backward compatible: Advanced users can still access lower-level APIs
- β Better DX: Improved developer experience and faster onboarding
Before (v1.x):
NetworkInfoDI.setupNetworkInfoDI();
final repo = GetIt.instance<INetworkInfoRepository>();
final ip = await repo.getPublicIp();
After (v2.x):
final ip = await NetworkInfo.getPublicIp();
Comparison with Other Packages #
| Feature | This Package | network_info_plus | connectivity_plus |
|---|---|---|---|
| Simple unified API | β | β | β |
| Auto-initialization | β | β | β |
| Public IP | β Multiple services | β | β |
| Local IP | β | β | β |
| Connectivity | β | β | β |
| Clean Architecture | β | β | β |
| DI Support | β GetIt | β | β |
| Testability | β Full mocking | β οΈ Limited | β οΈ Limited |
| SOLID Principles | β | β | β |
| Retry Logic | β Configurable | β | β |
| Fallback Services | β Multiple | β | β |
Future Enhancements #
- IPv6 Support: Add IPv6 address retrieval
- Caching: Add configurable caching for public IP
- Network Speed: Add network speed testing
- VPN Detection: Detect if VPN is active
- Proxy Detection: Detect proxy usage
- Network Type: Detailed network type (2G/3G/4G/5G)
More Examples #
Custom Configuration #
// Initialize with custom configuration
NetworkInfo.initialize(
config: NetworkInfoConfig(
publicIpServices: [
'https://api.ipify.org?format=text',
'https://icanhazip.com',
],
timeout: Duration(seconds: 10),
retryCount: 5,
),
);
// Then use normally
final publicIp = await NetworkInfo.getPublicIp();
Custom HTTP Client (Advanced DI) #
import 'package:http/http.dart' as http;
NetworkInfoDI.setupNetworkInfoDI(
customHttpClient: http.Client(),
config: NetworkInfoConfig(
timeout: Duration(seconds: 10),
),
);
Error Handling #
Errors are handled gracefully by returning null or false:
// Returns null if offline or service unavailable
final publicIp = await NetworkInfo.getPublicIp();
if (publicIp == null) {
print('Unable to retrieve public IP (offline or service unavailable)');
} else {
print('Public IP: $publicIp');
}
// Returns false if offline
final isConnected = await NetworkInfo.isConnected();
if (!isConnected) {
print('Device is offline');
}
// Always returns a valid model (with null IPs if unavailable)
final info = await NetworkInfo.getNetworkInfo();
print('Connected: ${info.isConnected}');
if (info.hasAnyIp) {
print('Best IP: ${info.bestAvailableIp}');
}
Testing #
The package includes comprehensive tests:
# Run all tests
cd packages/network_info
flutter test
# Run with coverage
flutter test --coverage
# Generate mocks
dart run build_runner build
SOLID Principles #
- Single Responsibility: Each class has one clear purpose
- Open/Closed: Extensible through interfaces
- Liskov Substitution: All implementations are substitutable
- Interface Segregation: Small, focused interfaces
- Dependency Inversion: Depends on abstractions, not concretions
Author #
Sepehr Tabeian
License #
This project is licensed under the MIT License - see the LICENSE file for details.
Copyright (c) 2025 Sepehr Tabeian