You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Flutter中如何获取当前网络速度?仅需查询下行速率,无需下载测试

Flutter 获取当前下行网络速率(无需下载测试)

如果不想通过下载文件的方式测试,而是直接获取当前实时下行速率,可以通过以下两种方案实现,核心都是基于系统网络流量统计计算速率:

方案一:使用第三方插件快速实现

推荐使用flutter_net_speed插件,它通过监听系统网络流量变化来计算实时速率,无需主动发起下载请求。

步骤:

  1. 在pubspec.yaml中添加依赖:
dependencies:
  flutter_net_speed: ^1.0.0 # 替换为最新版本
  1. 初始化并监听下行速率:
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 端实现

  1. 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();
  1. 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()
            }
        }
    }
}
  1. 添加权限:
    在AndroidManifest.xml中添加网络状态权限:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

iOS 端实现

  1. Flutter 端代码和Android端一致,复用上面的NetworkSpeedMonitor类。

  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.20 00:35:31