Flutter中如何获取当前网络速度?仅需查询下行速率,无需下载测试
Flutter 获取当前下行网络速率(无需下载测试)
如果不想通过下载文件的方式测试,而是直接获取当前实时下行速率,可以通过以下两种方案实现,核心都是基于系统网络流量统计计算速率:
方案一:使用第三方插件快速实现
推荐使用flutter_net_speed插件,它通过监听系统网络流量变化来计算实时速率,无需主动发起下载请求。
步骤:
- 在
pubspec.yaml中添加依赖:
dependencies: flutter_net_speed: ^1.0.0 # 替换为最新版本
- 初始化并监听下行速率:
import 'package:flutter/material.dart'; import 'package:flutter_net_speed/flutter_net_speed.dart'; class NetworkSpeedPage extends StatefulWidget { const NetworkSpeedPage({super.key}); @override State<NetworkSpeedPage> createState() => _NetworkSpeedPageState(); } class _NetworkSpeedPageState extends State<NetworkSpeedPage> { String _downSpeed = "0 KB/s"; @override void initState() { super.initState(); // 开始监听,每秒更新一次 FlutterNetSpeed().startSpeedListen( interval: 1000, onSpeed: (speed) { setState(() { // 转换为KB/s并保留两位小数 _downSpeed = "${(speed.downLoadSpeed / 1024).toStringAsFixed(2)} KB/s"; }); }, ); } @override void dispose() { // 页面销毁时停止监听 FlutterNetSpeed().stopSpeedListen(); super.dispose(); } @override Widget build(BuildContext context) { return Scaffold( appBar: AppBar(title: const Text("下行速率监控")), body: Center(child: Text("当前下行速率: $_downSpeed")), ); } }
方案二:自定义平台通道调用原生API
如果需要更底层的控制,或者不想依赖第三方插件,可以通过Flutter的平台通道直接调用Android/iOS原生的网络流量统计API。
Android 端实现
- Flutter 端代码:
import 'package:flutter/services.dart'; import 'dart:async'; class NetworkSpeedMonitor { static const MethodChannel _channel = MethodChannel('com.example/network_speed'); int _lastRxBytes = 0; Timer? _timer; Function(double)? onSpeedUpdate; void startMonitoring() { _timer?.cancel(); _timer = Timer.periodic(const Duration(seconds: 1), (timer) async { final currentRxBytes = await _channel.invokeMethod<int>('getTotalRxBytes') ?? 0; if (_lastRxBytes != 0 && onSpeedUpdate != null) { // 计算每秒下行速率,转换为KB/s final speed = (currentRxBytes - _lastRxBytes) / 1024.0; onSpeedUpdate!(speed); } _lastRxBytes = currentRxBytes; }); } void stopMonitoring() { _timer?.cancel(); _lastRxBytes = 0; } } // 使用示例 // final monitor = NetworkSpeedMonitor(); // monitor.onSpeedUpdate = (speed) { // print("当前下行速率: ${speed.toStringAsFixed(2)} KB/s"); // }; // monitor.startMonitoring();
- Android 原生代码(Kotlin):
在MainActivity中注册方法通道:
import android.net.TrafficStats import io.flutter.embedding.android.FlutterActivity import io.flutter.embedding.engine.FlutterEngine import io.flutter.plugin.common.MethodChannel class MainActivity : FlutterActivity() { private val CHANNEL = "com.example/network_speed" override fun configureFlutterEngine(flutterEngine: FlutterEngine) { super.configureFlutterEngine(flutterEngine) MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { call, result -> when (call.method) { "getTotalRxBytes" -> { // 获取设备累计接收的字节数(所有网络接口) val totalRx = TrafficStats.getTotalRxBytes() result.success(totalRx) } else -> result.notImplemented() } } } }
- 添加权限:
在AndroidManifest.xml中添加网络状态权限:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
iOS 端实现
Flutter 端代码和Android端一致,复用上面的
NetworkSpeedMonitor类。iOS 原生代码(Swift):
创建插件类并注册:
import Flutter import Foundation class NetworkSpeedPlugin: NSObject, FlutterPlugin { static func register(with registrar: FlutterPluginRegistrar) { let channel = FlutterMethodChannel(name: "com.example/network_speed", binaryMessenger: registrar.messenger()) let instance = NetworkSpeedPlugin() registrar.addMethodCallDelegate(instance, channel: channel) } func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) { switch call.method { case "getTotalRxBytes": var ifaddr: UnsafeMutablePointer<ifaddrs>? guard getifaddrs(&ifaddr) == 0 else { result(FlutterError(code: "GET_IFADDRS_FAILED", message: "Failed to retrieve network interfaces", details: nil)) return } var totalRx: UInt64 = 0 var ptr = ifaddr while ptr != nil { defer { ptr = ptr?.pointee.ifa_next } guard let interface = ptr?.pointee, let name = String(cString: interface.ifa_name, encoding: .utf8) else { continue } // 过滤有效网络接口(如Wi-Fi、蜂窝网络) if name.hasPrefix("en") || name.hasPrefix("pdp_ip") { let data = interface.ifa_data?.assumingMemoryBound(to: if_data.self) totalRx += UInt64(data?.pointee.ifi_ibytes ?? 0) } } freeifaddrs(ifaddr) result(totalRx) default: result(FlutterMethodNotImplemented) } } }
在AppDelegate中注册插件:
import Flutter @UIApplicationMain @objc class AppDelegate: FlutterAppDelegate { override func application( _ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]? ) -> Bool { GeneratedPluginRegistrant.register(with: self) NetworkSpeedPlugin.register(with: self.registrar(forPlugin: "NetworkSpeedPlugin")!) return super.application(application, didFinishLaunchingWithOptions: launchOptions) } }
注意事项
- 上述方案都是通过统计单位时间内的累计下行字节数差值计算速率,完全不需要下载文件,属于被动监听系统流量。
- Android 中
TrafficStats.getTotalRxBytes()返回的是设备开机以来的累计接收字节数,部分低版本系统可能不支持该API。 - iOS 中需要注意网络接口的过滤,避免统计本地回环接口的流量。
内容的提问来源于stack exchange,提问作者Zhuoyuan.Li
相关产品推荐
相关产品推荐

