New Ping, use servers to ping

This commit is contained in:
Junyuan Feng
2022-05-03 11:42:30 +08:00
parent fd1b2fc7b0
commit 9e2d49773f
6 changed files with 143 additions and 59 deletions

View File

@@ -49,7 +49,11 @@ class _AptManagePageState extends State<AptManagePage>
Navigator.of(context).pop();
return;
}
locator<AptProvider>().init(si.client!, si.status.sysVer.dist, () => scrollController.jumpTo(scrollController.position.maxScrollExtent));
locator<AptProvider>().init(
si.client!,
si.status.sysVer.dist,
() =>
scrollController.jumpTo(scrollController.position.maxScrollExtent));
}
@override

View File

@@ -1,10 +1,10 @@
import 'dart:io';
import 'package:dart_ping/dart_ping.dart';
import 'package:dart_ping_ios/dart_ping_ios.dart';
import 'package:flutter/material.dart';
import 'package:toolbox/core/extension/uint8list.dart';
import 'package:toolbox/core/utils.dart';
import 'package:toolbox/data/model/server/ping_result.dart';
import 'package:toolbox/data/provider/server.dart';
import 'package:toolbox/data/res/color.dart';
import 'package:toolbox/locator.dart';
import 'package:toolbox/view/widget/input_field.dart';
import 'package:toolbox/view/widget/round_rect_card.dart';
@@ -18,16 +18,13 @@ class PingPage extends StatefulWidget {
class _PingPageState extends State<PingPage>
with AutomaticKeepAliveClientMixin {
late TextEditingController _textEditingController;
Ping? _ping;
late MediaQueryData _media;
final List<PingResult> _results = [];
@override
void initState() {
super.initState();
_textEditingController = TextEditingController(text: '');
if (Platform.isIOS) {
DartPingIOS.register();
}
}
@override
@@ -47,25 +44,61 @@ class _PingPageState extends State<PingPage>
const SizedBox(height: 13),
buildInput(context, _textEditingController, maxLines: 1),
_buildControl(),
RoundRectCard(ConstrainedBox(
constraints: BoxConstraints(
minWidth: double.infinity,
minHeight: _media.size.height * 0.6,
),
)),
SizedBox(
width: double.infinity,
height: _media.size.height * 0.6,
child: ListView.builder(
itemCount: _results.length,
itemBuilder: (context, index) {
final result = _results[index];
return _buildResultItem(result);
}),
),
])),
onTap: () => FocusScope.of(context).requestFocus(FocusNode()),
),
);
}
void doPing() {
_ping = Ping(_textEditingController.text.trim());
_ping!.stream.listen((event) {
final resp = event.response.toString();
if (resp == 'null') return;
Widget _buildResultItem(PingResult result) {
return RoundRectCard(ListTile(
contentPadding: const EdgeInsets.symmetric(vertical: 7, horizontal: 17),
title: Text(result.serverName,
style: TextStyle(
fontSize: 18, fontWeight: FontWeight.bold, color: primaryColor)),
subtitle: Text(_buildPingSummary(result)),
trailing: Text(
'Avg: ' +
(result.statistic?.avg?.toStringAsFixed(2) ?? 'unkown') +
' ms',
style: TextStyle(fontSize: 14, color: primaryColor)),
));
}
String _buildPingSummary(PingResult result) {
final ip = result.ip ?? 'unkown';
final ttl = result.results?.first.ttl ?? 'unkown';
final loss = result.statistic?.loss ?? 'unkown';
final min = result.statistic?.min ?? 'unkown';
final max = result.statistic?.max ?? 'unkown';
return '$ip\nttl: $ttl, loss: $loss%\nmin: $min ms, max: $max ms';
}
Future<void> doPing() async {
_results.clear();
final target = _textEditingController.text.trim();
if (target.isEmpty) {
showSnackBar(context, const Text('Please input a target'));
return;
}
for (var si in locator<ServerProvider>().servers) {
if (si.client == null) {
continue;
}
final result = await si.client!.run('ping -c 3 $target').string;
_results.add(PingResult.parse(si.info.name, result));
setState(() {});
});
}
}
Widget _buildControl() {
@@ -86,11 +119,11 @@ class _PingPageState extends State<PingPage>
SizedBox(
width: 7,
),
Text('Stop')
Text('Clear')
],
),
onPressed: () {
if (_ping != null) _ping!.stop();
_results.clear();
},
),
TextButton(