Flutter网络速度测试插件speed_test_port的使用

Flutter网络速度测试插件speed_test_port的使用

安装

首先,在你的pubspec.yaml文件中添加该插件:

dependencies:
  speed_test_port: ^1.0.4

然后运行以下命令以下载并安装包:

dart pub get

确保你的项目使用的是稳定的Flutter版本。

使用示例

Streams 版本示例

示例版本在 “example” 文件夹中

Streams 示例

示例代码

import 'package:speed_test_port/speed_test_port_stream.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(),
      home: Scaffold(
        body: MyHomePage(),
      ),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key});

  @override
  State<MyHomePage> createState() {
    return _MyHomePageState();
  }
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;
  SpeedTestPortStream stream = SpeedTestPortStream();

  MyHomePageViewModel model = MyHomePageViewModel();
  
  @override
  void initState() {
    model = MyHomePageViewModel();
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    final ButtonStyle styleBlue = ElevatedButton.styleFrom(
        textStyle: const TextStyle(fontSize: 20), minimumSize: Size(0, 50), primary: Color(0xFF3A7EBC));
    model.initContext(context);
    return ChangeNotifierProvider<MyHomePageViewModel>.value(
        value: model,
        child: Consumer<MyHomePageViewModel>(
            builder: (_, vm, __) => Container(
                    child: Column(
                  children: [
                    SizedBox(height: 100),
                    Align(
                        alignment: Alignment.centerLeft,
                        child: Text("Connection info", style: TextStyle(fontWeight: FontWeight.normal))),
                    const SizedBox(height: 10),
                    Table(columnWidths: {
                      0: FlexColumnWidth(1),
                      1: FlexColumnWidth(1),
                      2: FlexColumnWidth(1),
                      3: FlexColumnWidth(1),
                    }, children: [
                      TableRow(children: [
                        Text("Server"),
                        Text("Ping"),
                        Text("IN, Mb/s"),
                        Text("OUT, Mb/s"),
                      ]),
                      TableRow(children: [
                        Text(model.SERVER ?? ""),
                        Text(model.PING ?? ""),
                        Text(model.IN ?? ""),
                        Text(model.OUT ?? ""),
                      ])
                    ]),
                    const SizedBox(height: 10),
                    SizedBox(
                      width: MediaQuery.of(context).size.width,
                      child: ElevatedButton(
                        style: styleBlue,
                        onPressed: () async {
                          await model.measureConnection();
                        },
                        child: const Text('Check connection'),
                      ),
                    )
                  ],
                ))));
  }
}

class MyHomePageViewModel extends ChangeNotifier {
  String? PING;
  String? IN;
  String? OUT;
  String? SERVER;
  SpeedTestPortStream _speedTestPortStream = SpeedTestPortStream();

  Future<void> measureConnection() async {
    var Title = "Getting settings...";

    showDialog<void>(
        barrierDismissible: false,
        context: _buildContext!,
        builder: (_) {
          return Dialog(
            backgroundColor: Colors.white,
            child: Padding(
              padding: const EdgeInsets.symmetric(vertical: 20),
              child: Column(
                mainAxisSize: MainAxisSize.min,
                children: [
                  CircularProgressIndicator(),
                  SizedBox(
                    height: 15,
                  ),
                  ChangeNotifierProvider<MyHomePageViewModel>.value(
                      value: this, child: Consumer<MyHomePageViewModel>(builder: (_, vm, __) => Text(Title)))
                ],
              ),
            ),
          );
        });

    _speedTestPortStream.getSettings().listen((settings) async {
      Title = "Checking servers...";
      notifyListeners();

      var serversTested = List<Server>.empty(growable: true);

      await for (final server in _speedTestPortStream.getServersWithLatency(servers: settings.servers)) {
        serversTested.add(server);
        Title = serversTested.length.toString() + "/" + settings.servers.length.toString() + " servers checked...";
        notifyListeners();
      }

      serversTested.sort((a, b) => a.latency.compareTo(b.latency));
      var bestServers = serversTested.take(3); //Take top 3 servers for test
      Server? bestServer;
      var downloadResults = List<SpeedTestResult>.empty(growable: true);

      _speedTestPortStream.testDownloadSpeed(servers: bestServers.toList()).listen((testResults) {
        switch (testResults.type) {
          case SpeedTestResultType.Try:
            Title = "[Download speed] checking server: " +
                testResults.server.toString() +
                " try " +
                testResults.tryCount.toString() +
                " done " +
                (testResults.withException
                    ? "with exception" + testResults.exception.toString()
                    : "successfully with result " + (testResults.speed).toStringAsFixed(2) + " Mb/s");
            notifyListeners();
            break;
          case SpeedTestResultType.ServerDone:
            Title = "[Download speed] checking server: " +
                testResults.server.toString() +
                " done " +
                (testResults.withException
                    ? "with exception" + testResults.exception.toString()
                    : "successfully with result " + (testResults.speed).toStringAsFixed(2) + " Mb/s");
            notifyListeners();
            downloadResults.add(testResults);
            break;
          case SpeedTestResultType.TestDone:
            downloadResults.sort((a, b) => a.server.latency.compareTo(b.server.latency));

            var bestTest = downloadResults.firstWhere((result) => result.withException == false);
            IN = (bestTest.speed).toStringAsFixed(2);
            bestServer = bestTest.server;
            SERVER = bestServer?.toString();
            PING = bestTest.server.latency.toString();

            Title = "[Download speed] result is done " +
                (testResults.withException
                    ? "with exception" + testResults.exception.toString()
                    : "with best server: " +
                        bestTest.server.toString() +
                        " with speed " +
                        bestTest.speed.toStringAsFixed(2) +
                        " Mb/s");
            notifyListeners();

            break;
        }
      }).onDone(() {
        if (bestServer != null) {
          _speedTestPortStream.testUploadSpeed(servers: List.filled(1, bestServer!)).listen((testResults) {
            switch (testResults.type) {
              case SpeedTestResultType.Try:
                Title = "[Upload speed] checking server: " +
                    testResults.server.toString() +
                    " try " +
                    testResults.tryCount.toString() +
                    " done " +
                    (testResults.withException
                        ? "with exception" + testResults.exception.toString()
                        : "successfully with result " + (testResults.speed).toStringAsFixed(2) + " Mb/s");
                notifyListeners();
                break;
              case SpeedTestResultType.ServerDone:
                Title = "[Upload speed] checking server: " +
                    testResults.server.toString() +
                    " done " +
                    (testResults.withException
                        ? "with exception" + testResults.exception.toString()
                        : "successfully with result " + (testResults.speed).toStringAsFixed(2) + " Mb/s");

                OUT = (testResults.speed).toStringAsFixed(2);
                notifyListeners();

                break;
              case SpeedTestResultType.TestDone:
                Title = "All tests is done!";
                notifyListeners();
                break;
            }
          }).onDone(() {
            Navigator.of(_buildContext!).pop();
          });
        } else {
          //TODO: show error
          Navigator.of(_buildContext!).pop();
        }
      });
    });
  }

  BuildContext? _buildContext;
  void initContext(BuildContext buildContext) {
    _buildContext = buildContext;
  }
}

Future 版本示例

示例代码

// 创建一个测试实例
SpeedTestPort tester = SpeedTestPort();

// 存储最佳服务器的变量
List<Server> bestServersList = [];

// 示例函数用于设置最佳服务器,可以在 initState 中调用
Future<void> setBestServers() async {
  final settings = await tester.getSettings();
  final servers = settings.servers;

  final _bestServersList = await tester.getBestServers(
    servers: servers,
  );

  setState(() {
    bestServersList = _bestServersList;
  });
}

// 测试下载速度(单位:MB/s)
final downloadRate = await tester.testDownloadSpeed(servers: bestServersList);

// 测试上传速度(单位:MB/s)
final uploadRate = await tester.testUploadSpeed(servers: bestServersList);

更多关于Flutter网络速度测试插件speed_test_port的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter网络速度测试插件speed_test_port的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用speed_test_port插件来进行网络速度测试的示例代码。speed_test_port插件允许你测量下载和上传速度。首先,确保你已经在pubspec.yaml文件中添加了依赖项:

dependencies:
  flutter:
    sdk: flutter
  speed_test_port: ^x.y.z  # 请替换为最新版本号

然后运行flutter pub get来安装依赖。

接下来,你可以在你的Flutter应用中使用该插件进行网络速度测试。以下是一个完整的示例代码:

import 'package:flutter/material.dart';
import 'package:speed_test_port/speed_test_port.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatefulWidget {
  @override
  _MyAppState createState() => _MyAppState();
}

class _MyAppState extends State<MyApp> {
  String downloadSpeed = 'N/A';
  String uploadSpeed = 'N/A';
  bool isTesting = false;

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: Text('Network Speed Test'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Text(
                'Download Speed: $downloadSpeed Mbps',
                style: TextStyle(fontSize: 20),
              ),
              SizedBox(height: 20),
              Text(
                'Upload Speed: $uploadSpeed Mbps',
                style: TextStyle(fontSize: 20),
              ),
              SizedBox(height: 40),
              ElevatedButton(
                onPressed: isTesting ? null : _startSpeedTest,
                child: Text(isTesting ? 'Testing...' : 'Start Speed Test'),
              ),
            ],
          ),
        ),
      ),
    );
  }

  Future<void> _startSpeedTest() async {
    setState(() {
      isTesting = true;
    });

    try {
      SpeedTest test = SpeedTest();
      SpeedTestResult result = await test.testDownloadSpeed();
      double downloadMbps = result.mbps;

      result = await test.testUploadSpeed();
      double uploadMbps = result.mbps;

      setState(() {
        downloadSpeed = downloadMbps.toStringAsFixed(2);
        uploadSpeed = uploadMbps.toStringAsFixed(2);
        isTesting = false;
      });
    } catch (e) {
      print('Error during speed test: $e');
      setState(() {
        downloadSpeed = 'Error';
        uploadSpeed = 'Error';
        isTesting = false;
      });
    }
  }
}

在这个示例中:

  1. 我们首先导入了speed_test_port包。
  2. 创建了一个简单的Flutter应用,其中包含一个文本显示下载和上传速度,以及一个按钮来启动速度测试。
  3. _startSpeedTest函数中,我们实例化了SpeedTest类,并分别调用testDownloadSpeedtestUploadSpeed方法来测量下载和上传速度。
  4. 使用setState方法来更新UI,显示测试结果或错误信息。

请注意,speed_test_port插件的实际使用可能会受到网络条件、服务器位置和可用带宽等因素的影响。确保在真实环境中测试该插件以验证其性能和准确性。

回到顶部