使用provider获取数据,Android底部导航栏透明

This commit is contained in:
LollipopKit
2021-09-17 22:31:30 +08:00
parent 6b72bc9509
commit 2c9b08264f
5 changed files with 166 additions and 157 deletions

View File

@@ -5,13 +5,9 @@ import 'package:flutter/widgets.dart';
import 'package:flutter_staggered_animations/flutter_staggered_animations.dart';
import 'package:get_it/get_it.dart';
import 'package:provider/provider.dart';
import 'package:ssh2/ssh2.dart';
import 'package:toolbox/core/extension/stringx.dart';
import 'package:toolbox/core/utils.dart';
import 'package:toolbox/data/model/disk_info.dart';
import 'package:toolbox/data/model/server_private_info.dart';
import 'package:toolbox/data/model/server_status.dart';
import 'package:toolbox/data/model/tcp_status.dart';
import 'package:toolbox/data/provider/server.dart';
import 'package:toolbox/locator.dart';
import 'package:toolbox/view/widget/circle_pie.dart';
@@ -76,8 +72,8 @@ class _ServerPageState extends State<ServerPage>
),
children: [
const SizedBox(height: 13),
...pro.servers
.map((e) => _buildEachServerCard(e, pro.servers.indexOf(e)))
...pro.servers.map((e) => _buildEachServerCard(
pro.serversStatus[pro.servers.indexOf(e)], e))
],
));
})),
@@ -182,159 +178,29 @@ class _ServerPageState extends State<ServerPage>
);
}
Future<ServerStatus>? _getData(ServerPrivateInfo info) async {
final client = SSHClient(
host: info.ip!,
port: info.port!,
username: info.user!,
passwordOrKey: info.authorization,
);
await client.connect();
final cpu = await client.execute(
"top -bn1 | grep load | awk '{printf \"%.2f\", \$(NF-2)}'") ??
'0';
final mem = await client.execute('free -m') ?? '';
final sysVer = await client.execute('cat /etc/issue.net') ?? 'Unkown';
final upTime = await client.execute('uptime') ?? 'Failed';
final disk = await client.execute('df -h') ?? 'Failed';
final tcp = await client.execute('cat /proc/net/snmp') ?? 'Failed';
return ServerStatus(
cpuPercent: double.parse(cpu.trim()),
memList: _getMem(mem),
sysVer: sysVer.trim(),
disk: _getDisk(disk),
uptime: _getUpTime(upTime),
tcp: _getTcp(tcp));
}
String _getUpTime(String raw) {
return raw.split('up ')[1].split(', ')[0];
}
TcpStatus _getTcp(String raw) {
final lines = raw.split('\n');
int idx = 0;
for (var item in lines) {
if (item.contains('Tcp:')) {
idx++;
}
if (idx == 2) {
final vals = item.split(RegExp(r'\s{1,}'));
return TcpStatus(
maxConn: vals[5].i,
active: vals[6].i,
passive: vals[7].i,
fail: vals[8].i);
}
}
return TcpStatus(maxConn: 0, active: 0, passive: 0, fail: 0);
}
List<DiskInfo> _getDisk(String disk) {
final list = <DiskInfo>[];
final items = disk.split('\n');
for (var item in items) {
if (items.indexOf(item) == 0 || item.isEmpty) {
continue;
}
final vals = item.split(RegExp(r'\s{1,}'));
list.add(DiskInfo(
mountPath: vals[1],
mountLocation: vals[5],
usedPercent: double.parse(vals[4].replaceFirst('%', '')),
used: vals[2],
size: vals[1],
avail: vals[3]));
}
return list;
}
List<int> _getMem(String mem) {
for (var item in mem.split('\n')) {
if (item.contains('Mem:')) {
return RegExp(r'[1-9][0-9]*')
.allMatches(item)
.map((e) => int.parse(item.substring(e.start, e.end)))
.toList();
}
}
return [];
}
Widget _buildEachServerCard(ServerPrivateInfo e, int index) {
return FutureBuilder<ServerStatus>(
future: _getData(e),
builder: (BuildContext context, AsyncSnapshot<ServerStatus> snapshot) {
return GestureDetector(
child: _buildEachCardContent(snapshot, e.name ?? '', index),
onLongPress: () =>
showRoundDialog(context, '是否删除', const Text('删除后无法恢复'), [
TextButton(
onPressed: () => Navigator.of(context).pop(),
child: const Text('')),
TextButton(
onPressed: () {
serverProvider.delServer(e);
Navigator.of(context).pop();
},
child: const Text(''))
]),
);
},
Widget _buildEachServerCard(ServerStatus ss, ServerPrivateInfo spi) {
return GestureDetector(
child: _buildEachCardContent(ss, spi),
onLongPress: () =>
showRoundDialog(context, '是否删除', const Text('删除后无法恢复'), [
TextButton(
onPressed: () => Navigator.of(context).pop(),
child: const Text('')),
TextButton(
onPressed: () {
serverProvider.delServer(spi);
Navigator.of(context).pop();
},
child: const Text(''))
]),
);
}
Widget _buildEachCardContent(
AsyncSnapshot<ServerStatus> snapshot, String serverName, int index) {
Widget child;
if (snapshot.connectionState != ConnectionState.done) {
if (cachedServerStatus.length > index && cachedServerStatus.elementAt(index) != null) {
child = _buildRealServerCard(cachedServerStatus.elementAt(index)!, serverName);
} else {
child = _buildRealServerCard(
ServerStatus(
cpuPercent: 0,
memList: [100, 0],
disk: [
DiskInfo(
mountLocation: '',
mountPath: '',
used: '',
size: '',
avail: '',
usedPercent: 0)
],
sysVer: '',
uptime: '',
tcp: TcpStatus(maxConn: 0, active: 0, passive: 0, fail: 0)),
serverName);
}
} else if (snapshot.hasError) {
child = Column(
children: [
Text(
serverName,
style: const TextStyle(fontWeight: FontWeight.bold),
),
Center(
child: Text("Error: ${snapshot.error}"),
)
],
);
} else {
if (cachedServerStatus.length <= index) {
cachedServerStatus.add(snapshot.data!);
} else {
cachedServerStatus[index] = snapshot.data!;
}
child = _buildRealServerCard(snapshot.data!, serverName);
}
Widget _buildEachCardContent(ServerStatus ss, ServerPrivateInfo spi) {
return Card(
child: Padding(
padding: const EdgeInsets.all(13),
child: child,
child: _buildRealServerCard(ss, spi.name ?? ''),
),
);
}
@@ -461,6 +327,8 @@ class _ServerPageState extends State<ServerPage>
@override
Future<void> afterFirstLayout(BuildContext context) async {
await GetIt.I.allReady();
await locator<ServerProvider>().loadData();
await serverProvider.loadLocalData();
await serverProvider.refreshData();
await serverProvider.startAutoRefresh();
}
}