Flutter网络速度测试插件speed_test_port的使用
Flutter网络速度测试插件speed_test_port的使用
安装
首先,在你的pubspec.yaml
文件中添加该插件:
dependencies:
speed_test_port: ^1.0.4
然后运行以下命令以下载并安装包:
dart pub get
确保你的项目使用的是稳定的Flutter版本。
使用示例
Streams 版本示例
示例版本在 “example” 文件夹中

示例代码
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;
});
}
}
}
在这个示例中:
- 我们首先导入了
speed_test_port
包。 - 创建了一个简单的Flutter应用,其中包含一个文本显示下载和上传速度,以及一个按钮来启动速度测试。
- 在
_startSpeedTest
函数中,我们实例化了SpeedTest
类,并分别调用testDownloadSpeed
和testUploadSpeed
方法来测量下载和上传速度。 - 使用
setState
方法来更新UI,显示测试结果或错误信息。
请注意,speed_test_port
插件的实际使用可能会受到网络条件、服务器位置和可用带宽等因素的影响。确保在真实环境中测试该插件以验证其性能和准确性。