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
Libraries
- network_info
- Network Info Package A standalone Flutter package for retrieving network information