dio_speed_tracker
A lightweight and extensible Dio interceptor that tracks real-world network download speeds in Mbps, using actual HTTP responses instead of ICMP pings.
This is a practical alternative to custom_ping, ideal for apps where ICMP (ping) is blocked or unreliable โ or when you want real-world performance metrics rather than synthetic ones.
๐ Features
- โ Dio interceptor that measures network speed from actual downloads
- ๐ Emits NetworkStatus.poorwhen average speed drops below a threshold
- ๐ Rolling average for smoothing out results
- โ๏ธ Configurable sample size, duration, and thresholds
- ๐งฉ No platform channels or native code needed
- ๐ Suitable for Flutter & Dart web/server apps alike
๐ฆ Installation
Add this to your pubspec.yaml:
dependencies:
  dio: ^5.0.0
  collection: ^1.17.2
  dio_speed_tracker: ^0.0.3
๐ Usage
1. Create and attach the interceptor
final speedController = NetworkSpeedController(
  maxSpeedSamples: 10,
  minResultsToCheck: 5,
  poorConnectionThreshold: 2.0, // Mbps
);
final dio = Dio();
dio.interceptors.add(
  SpeedInterceptor(
  speedController,
  minTrackableSize: 10 * 1024, // 10 KB
  minDuration: Duration(milliseconds: 20),
  ),
);
2. Listen for connection quality
speedController.stream.listen((status) {
  if (status == NetworkStatus.poor) {
    print("๐จ Poor connection detected!");
    // Optionally show a UI warning or fallback
  }
});
3. Clean up
Don't forget to dispose of the controller when no longer needed:
@override
void dispose() {
  speedController.dispose();
  super.dispose();
}
๐ How It Works
- The interceptor uses Dio's onReceiveProgressto measure how long a real HTTP download takes.
- It calculates Mbps based on size and duration.
- Speeds are stored in a rolling buffer, and the average is continuously evaluated.
- When the average falls below the defined threshold, it emits NetworkStatus.pooron the stream.
๐ Why Not custom_ping?
Unlike custom_ping:
| Feature | dio_speed_tracker | custom_ping | 
|---|---|---|
| Real download-based speed | โ | โ | 
| Works without ICMP permissions | โ | โ | 
| Cross-platform compatible | โ | ๐ซ (native) | 
| Dio integration | โ | โ | 
| No extra request calls | โ | โ | 
| Single request evaluation | โ (TBD) | โ | 
๐งช Testing
This package includes full unit test coverage for:
- Speed sample tracking and averaging
- Rolling window logic
- Threshold stream emission
- Basic interceptor setup
Run tests:
flutter test
Youโll find the test files in:
test/
โโโ network_speed_controller_test.dart
โโโ speed_interceptor_test.dart
๐งฐ Requirements
- Dart 2.17+
- Dio 5+
- collectionpackage for calculating averages
๐ License
MIT License โ free for personal or commercial use.
๐ Contributing
Contributions and issues welcome!
If you have improvements or new ideas, feel free to open a PR or start a discussion.
๐ Links
- custom_ping on pub.dev โ the package this improves upon
- Dio HTTP Client