服务器状态页预览部分完成

This commit is contained in:
LollipopKit
2021-09-18 19:03:06 +08:00
parent 2c9b08264f
commit 962ef4ca48
12 changed files with 223 additions and 139 deletions

3
.gitignore vendored
View File

@@ -44,3 +44,6 @@ app.*.map.json
/android/app/debug /android/app/debug
/android/app/profile /android/app/profile
/android/app/release /android/app/release
/android/app/fjy.androidstudio.key
/release

View File

@@ -6,6 +6,12 @@ if (localPropertiesFile.exists()) {
} }
} }
def keystoreProperties = new Properties()
def keystorePropertiesFile = rootProject.file('key.properties')
if (keystorePropertiesFile.exists()) {
keystoreProperties.load(new FileInputStream(keystorePropertiesFile))
}
def flutterRoot = localProperties.getProperty('flutter.sdk') def flutterRoot = localProperties.getProperty('flutter.sdk')
if (flutterRoot == null) { if (flutterRoot == null) {
throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.") throw new GradleException("Flutter SDK not found. Define location with flutter.sdk in the local.properties file.")
@@ -50,6 +56,15 @@ android {
versionName flutterVersionName versionName flutterVersionName
} }
signingConfigs {
release {
keyAlias keystoreProperties['keyAlias']
keyPassword keystoreProperties['keyPassword']
storeFile keystoreProperties['storeFile'] ? file(keystoreProperties['storeFile']) : null
storePassword keystoreProperties['storePassword']
}
}
buildTypes { buildTypes {
release { release {
// TODO: Add your own signing config for the release build. // TODO: Add your own signing config for the release build.

View File

@@ -2,8 +2,12 @@ PODS:
- countly_flutter (20.11.4): - countly_flutter (20.11.4):
- Flutter - Flutter
- Flutter (1.0.0) - Flutter (1.0.0)
- GZ-NMSSH (4.1.5)
- path_provider (0.0.1): - path_provider (0.0.1):
- Flutter - Flutter
- ssh2 (2.2.2):
- Flutter
- GZ-NMSSH (~> 4.1.5)
- url_launcher (0.0.1): - url_launcher (0.0.1):
- Flutter - Flutter
@@ -11,8 +15,13 @@ DEPENDENCIES:
- countly_flutter (from `.symlinks/plugins/countly_flutter/ios`) - countly_flutter (from `.symlinks/plugins/countly_flutter/ios`)
- Flutter (from `Flutter`) - Flutter (from `Flutter`)
- path_provider (from `.symlinks/plugins/path_provider/ios`) - path_provider (from `.symlinks/plugins/path_provider/ios`)
- ssh2 (from `.symlinks/plugins/ssh2/ios`)
- url_launcher (from `.symlinks/plugins/url_launcher/ios`) - url_launcher (from `.symlinks/plugins/url_launcher/ios`)
SPEC REPOS:
trunk:
- GZ-NMSSH
EXTERNAL SOURCES: EXTERNAL SOURCES:
countly_flutter: countly_flutter:
:path: ".symlinks/plugins/countly_flutter/ios" :path: ".symlinks/plugins/countly_flutter/ios"
@@ -20,15 +29,19 @@ EXTERNAL SOURCES:
:path: Flutter :path: Flutter
path_provider: path_provider:
:path: ".symlinks/plugins/path_provider/ios" :path: ".symlinks/plugins/path_provider/ios"
ssh2:
:path: ".symlinks/plugins/ssh2/ios"
url_launcher: url_launcher:
:path: ".symlinks/plugins/url_launcher/ios" :path: ".symlinks/plugins/url_launcher/ios"
SPEC CHECKSUMS: SPEC CHECKSUMS:
countly_flutter: 38419412e193a1faa5babeb5d28a63fda260687d countly_flutter: 38419412e193a1faa5babeb5d28a63fda260687d
Flutter: 50d75fe2f02b26cc09d224853bb45737f8b3214a Flutter: 50d75fe2f02b26cc09d224853bb45737f8b3214a
GZ-NMSSH: d749f8ae2fd0094b953cd1d5abd8e0cab3c93f8d
path_provider: abfe2b5c733d04e238b0d8691db0cfd63a27a93c path_provider: abfe2b5c733d04e238b0d8691db0cfd63a27a93c
ssh2: 5ded7906964d0e71e2204e5e031a155528df4674
url_launcher: 6fef411d543ceb26efce54b05a0a40bfd74cbbef url_launcher: 6fef411d543ceb26efce54b05a0a40bfd74cbbef
PODFILE CHECKSUM: aafe91acc616949ddb318b77800a7f51bffa2a4c PODFILE CHECKSUM: aafe91acc616949ddb318b77800a7f51bffa2a4c
COCOAPODS: 1.10.2 COCOAPODS: 1.11.2

View File

@@ -0,0 +1,11 @@
import 'package:ssh2/ssh2.dart';
import 'package:toolbox/data/model/server_private_info.dart';
import 'package:toolbox/data/model/server_status.dart';
class ServerInfo {
ServerPrivateInfo info;
ServerStatus status;
SSHClient client;
ServerInfo(this.info, this.status, this.client);
}

View File

@@ -11,9 +11,9 @@ import 'package:toolbox/data/store/server.dart';
import 'package:toolbox/locator.dart'; import 'package:toolbox/locator.dart';
class ServerProvider extends BusyProvider { class ServerProvider extends BusyProvider {
late List<ServerPrivateInfo> _servers; List<ServerPrivateInfo> _servers = [];
late List<ServerStatus> _serversStatus; List<ServerStatus> _serversStatus = [];
late List<SSHClient> _clients; List<SSHClient> _clients = [];
List<ServerPrivateInfo> get servers => _servers; List<ServerPrivateInfo> get servers => _servers;
List<ServerStatus> get serversStatus => _serversStatus; List<ServerStatus> get serversStatus => _serversStatus;
@@ -23,11 +23,11 @@ class ServerProvider extends BusyProvider {
memList: [100, 0], memList: [100, 0],
disk: [ disk: [
DiskInfo( DiskInfo(
mountLocation: '', mountLocation: '/',
mountPath: '', mountPath: '/',
used: '', used: '0',
size: '', size: '0',
avail: '', avail: '0',
usedPercent: 0) usedPercent: 0)
], ],
sysVer: '', sysVer: '',
@@ -37,17 +37,35 @@ class ServerProvider extends BusyProvider {
Future<void> loadLocalData() async { Future<void> loadLocalData() async {
setBusyState(true); setBusyState(true);
_servers = locator<ServerStore>().fetch(); _servers = locator<ServerStore>().fetch();
_serversStatus = List.generate(_servers.length, (_) => emptyStatus); initStatusList();
setBusyState(false);
notifyListeners();
}
void initStatusList() {
_clients = List.generate( _clients = List.generate(
_servers.length, _servers.length,
(idx) => SSHClient( (idx) => _fillClient(idx));
_serversStatus = List.generate(_servers.length, (idx) => _fillStatus(idx));
}
SSHClient _fillClient(int idx) {
if (idx < _clients.length) {
return _clients[idx];
}
return SSHClient(
host: _servers[idx].ip!, host: _servers[idx].ip!,
port: _servers[idx].port!, port: _servers[idx].port!,
username: _servers[idx].user!, username: _servers[idx].user!,
passwordOrKey: _servers[idx].authorization, passwordOrKey: _servers[idx].authorization,
)); );
setBusyState(false); }
notifyListeners();
ServerStatus _fillStatus(int idx) {
if (idx < _serversStatus.length) {
return _serversStatus[idx];
}
return emptyStatus;
} }
Future<void> refreshData() async { Future<void> refreshData() async {
@@ -57,7 +75,7 @@ class ServerProvider extends BusyProvider {
} }
Future<void> startAutoRefresh() async { Future<void> startAutoRefresh() async {
Timer.periodic(const Duration(seconds: 3), (_) async { Timer.periodic(const Duration(seconds: 7), (_) async {
await refreshData(); await refreshData();
}); });
} }
@@ -65,12 +83,21 @@ class ServerProvider extends BusyProvider {
void addServer(ServerPrivateInfo info) { void addServer(ServerPrivateInfo info) {
_servers.add(info); _servers.add(info);
locator<ServerStore>().put(info); locator<ServerStore>().put(info);
initStatusList();
notifyListeners(); notifyListeners();
} }
void delServer(ServerPrivateInfo info) { void delServer(ServerPrivateInfo info) {
_servers.remove(info); _servers.remove(info);
locator<ServerStore>().delete(info); locator<ServerStore>().delete(info);
initStatusList();
notifyListeners();
}
void updateServer(ServerPrivateInfo old, ServerPrivateInfo newInfo) {
_servers[_servers.indexOf(old)] = newInfo;
locator<ServerStore>().update(old, newInfo);
initStatusList();
notifyListeners(); notifyListeners();
} }

View File

@@ -2,9 +2,8 @@
class BuildData { class BuildData {
static const String name = "ToolBox"; static const String name = "ToolBox";
static const int build = 40; static const int build = 10;
static const String engine = static const String engine = "Flutter 2.5.0 • channel stable • https://github.com/flutter/flutter.git\nFramework • revision 4cc385b4b8 (10 days ago) • 2021-09-07 23:01:49 -0700\nEngine • revision f0826da7ef\nTools • Dart 2.14.0\n";
"Flutter 2.2.3 • channel stable • https://github.com/flutter/flutter.git\nFramework • revision f4abaa0735 (9 weeks ago) • 2021-07-01 12:46:11 -0700\nEngine • revision 241c87ad80\nTools • Dart 2.13.4\n"; static const String buildAt = "2021-09-18 17:25:30.528659";
static const String buildAt = "2021-09-04 09:34:17.507782"; static const int modifications = 9;
static const int modifications = 0;
} }

View File

@@ -17,11 +17,18 @@ class ServerStore extends PersistentStore {
void delete(ServerPrivateInfo s) { void delete(ServerPrivateInfo s) {
final ss = fetch(); final ss = fetch();
ss.removeWhere((e) => e.ip == s.ip && e.port == s.port && e.user == e.user); ss.removeAt(index(s));
box.put('servers', json.encode(ss)); box.put('servers', json.encode(ss));
} }
bool have(ServerPrivateInfo s) => fetch() void update(ServerPrivateInfo old, ServerPrivateInfo newInfo) {
.where((e) => e.ip == s.ip && e.port == s.port && e.user == e.user) final ss = fetch();
.isNotEmpty; ss[index(old)] = newInfo;
box.put('servers', json.encode(ss));
}
int index(ServerPrivateInfo s) => fetch()
.indexWhere((e) => e.ip == s.ip && e.port == s.port && e.user == e.user);
bool have(ServerPrivateInfo s) => index(s) != -1;
} }

View File

@@ -81,36 +81,7 @@ class _ServerPageState extends State<ServerPage>
onTap: () => FocusScope.of(context).requestFocus(FocusNode()), onTap: () => FocusScope.of(context).requestFocus(FocusNode()),
), ),
floatingActionButton: FloatingActionButton( floatingActionButton: FloatingActionButton(
onPressed: () { onPressed: () => showAddServerDialog(),
showRoundDialog(context, '新建服务器连接', _buildTextInputField(context), [
TextButton(
onPressed: () => Navigator.of(context).pop(),
child: const Text('关闭')),
TextButton(
onPressed: () {
final authorization = keyController.text.isEmpty
? passwordController.text
: {
"privateKey": keyController.text,
"passphrase": passwordController.text
};
serverProvider.addServer(ServerPrivateInfo(
name: nameController.text,
ip: ipController.text,
port: int.parse(portController.text),
user: usernameController.text,
authorization: authorization));
nameController.clear();
ipController.clear();
portController.clear();
usernameController.clear();
passwordController.clear();
keyController.clear();
Navigator.of(context).pop();
},
child: const Text('连接'))
]);
},
tooltip: 'add a server', tooltip: 'add a server',
heroTag: 'server page fab', heroTag: 'server page fab',
child: const Icon(Icons.add), child: const Icon(Icons.add),
@@ -118,6 +89,37 @@ class _ServerPageState extends State<ServerPage>
); );
} }
void showAddServerDialog() {
showRoundDialog(context, '新建服务器连接', _buildTextInputField(context), [
TextButton(
onPressed: () => Navigator.of(context).pop(),
child: const Text('关闭')),
TextButton(
onPressed: () {
final authorization = keyController.text.isEmpty
? passwordController.text
: {
"privateKey": keyController.text,
"passphrase": passwordController.text
};
serverProvider.addServer(ServerPrivateInfo(
name: nameController.text,
ip: ipController.text,
port: int.parse(portController.text),
user: usernameController.text,
authorization: authorization));
nameController.clear();
ipController.clear();
portController.clear();
usernameController.clear();
passwordController.clear();
keyController.clear();
Navigator.of(context).pop();
},
child: const Text('连接'))
]);
}
InputDecoration _buildDecoration(String label, {TextStyle? textStyle}) { InputDecoration _buildDecoration(String label, {TextStyle? textStyle}) {
return InputDecoration(labelText: label, labelStyle: textStyle); return InputDecoration(labelText: label, labelStyle: textStyle);
} }
@@ -214,6 +216,13 @@ class _ServerPageState extends State<ServerPage>
for (var e in ss.memList!) { for (var e in ss.memList!) {
memData.add(IndexPercent(ss.memList!.indexOf(e), e!.toInt())); memData.add(IndexPercent(ss.memList!.indexOf(e), e!.toInt()));
} }
final mem1 = memData[1];
memData[1] = memData.last;
memData.last = mem1;
final rootDisk = ss.disk!.firstWhere((element) => element!.mountLocation == '/');
return Column( return Column(
crossAxisAlignment: CrossAxisAlignment.start, crossAxisAlignment: CrossAxisAlignment.start,
children: [ children: [
@@ -247,42 +256,45 @@ class _ServerPageState extends State<ServerPage>
ss.memList![1]! / ss.memList![0]! * 100, 'Mem', [ ss.memList![1]! / ss.memList![0]! * 100, 'Mem', [
chart.Series<IndexPercent, int>( chart.Series<IndexPercent, int>(
id: 'Mem', id: 'Mem',
domainFn: (IndexPercent sales, _) => sales.id, domainFn: (IndexPercent mem, _) => mem.id,
measureFn: (IndexPercent sales, _) => sales.percent, measureFn: (IndexPercent mem, _) => mem.percent,
data: memData, data: memData,
) )
]), ]),
_buildIOData('Net', ss.tcp!.maxConn!.toString(), '0kb/s'), _buildIOData('Net', 'Conn:\n' + ss.tcp!.maxConn!.toString(), 'Fail:\n' + ss.tcp!.fail.toString()),
_buildIOData('Disk', '0kb/s', '0kb/s') _buildIOData('Disk', 'Total:\n' + rootDisk!.size!, 'Used:\n' + rootDisk.usedPercent.toString() + '%')
], ],
) ),
], ],
); );
} }
Widget _buildIOData(String title, String up, String down) { Widget _buildIOData(String title, String up, String down) {
final statusTextStyle = TextStyle(fontSize: 11, color: _theme.textTheme.bodyText1!.color!.withAlpha(177));
return SizedBox( return SizedBox(
width: _media.size.width * 0.2, width: _media.size.width * 0.2,
height: _media.size.height * 0.1, height: _media.size.height * 0.1,
child: Stack( child: Stack(
children: [ children: [
Positioned( Positioned.fill(
child: Column( child: Center(
mainAxisAlignment: MainAxisAlignment.center, child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: [ children: [
Text( Text(
'$up', up,
textAlign: TextAlign.start, style: statusTextStyle,
textAlign: TextAlign.center,
), ),
const SizedBox(height: 3),
Text( Text(
'$down', down + '\n',
style: statusTextStyle,
textAlign: TextAlign.center, textAlign: TextAlign.center,
) )
], ],
), ),
top: _media.size.height * 0.012, ),
left: 0,
right: 0,
), ),
Positioned( Positioned(
child: Text(title, textAlign: TextAlign.center), child: Text(title, textAlign: TextAlign.center),
@@ -302,14 +314,11 @@ class _ServerPageState extends State<ServerPage>
child: Stack( child: Stack(
children: [ children: [
DonutPieChart(series), DonutPieChart(series),
Positioned( Positioned.fill(
child: Text( child: Center(child: Text(
'${percent.toStringAsFixed(1)}%', '${percent.toStringAsFixed(1)}%\n',
textAlign: TextAlign.center, textAlign: TextAlign.center,
), ),),
left: 0,
right: 0,
top: _media.size.height * 0.03,
), ),
Positioned( Positioned(
child: Text(title, textAlign: TextAlign.center), child: Text(title, textAlign: TextAlign.center),

0
make.dart Normal file → Executable file
View File

View File

@@ -5,63 +5,63 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: after_layout name: after_layout
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.1.0" version: "1.1.0"
async: async:
dependency: transitive dependency: transitive
description: description:
name: async name: async
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.8.1" version: "2.8.1"
boolean_selector: boolean_selector:
dependency: transitive dependency: transitive
description: description:
name: boolean_selector name: boolean_selector
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.1.0" version: "2.1.0"
characters: characters:
dependency: transitive dependency: transitive
description: description:
name: characters name: characters
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.1.0" version: "1.1.0"
charcode: charcode:
dependency: transitive dependency: transitive
description: description:
name: charcode name: charcode
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.3.1" version: "1.3.1"
charts_common: charts_common:
dependency: transitive dependency: transitive
description: description:
name: charts_common name: charts_common
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.11.0" version: "0.11.0"
charts_flutter: charts_flutter:
dependency: "direct main" dependency: "direct main"
description: description:
name: charts_flutter name: charts_flutter
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.11.0" version: "0.11.0"
clock: clock:
dependency: transitive dependency: transitive
description: description:
name: clock name: clock
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.1.0" version: "1.1.0"
collection: collection:
dependency: transitive dependency: transitive
description: description:
name: collection name: collection
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.15.0" version: "1.15.0"
countly_flutter: countly_flutter:
@@ -77,49 +77,49 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: crypto name: crypto
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "3.0.1" version: "3.0.1"
dio: dio:
dependency: "direct main" dependency: "direct main"
description: description:
name: dio name: dio
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "4.0.0" version: "4.0.0"
extended_image: extended_image:
dependency: "direct main" dependency: "direct main"
description: description:
name: extended_image name: extended_image
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "4.2.1" version: "4.2.1"
extended_image_library: extended_image_library:
dependency: transitive dependency: transitive
description: description:
name: extended_image_library name: extended_image_library
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "3.1.0" version: "3.1.0"
fake_async: fake_async:
dependency: transitive dependency: transitive
description: description:
name: fake_async name: fake_async
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.2.0" version: "1.2.0"
ffi: ffi:
dependency: transitive dependency: transitive
description: description:
name: ffi name: ffi
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.1.2" version: "1.1.2"
file: file:
dependency: transitive dependency: transitive
description: description:
name: file name: file
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "6.1.2" version: "6.1.2"
flutter: flutter:
@@ -131,21 +131,21 @@ packages:
dependency: "direct dev" dependency: "direct dev"
description: description:
name: flutter_lints name: flutter_lints
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.0.4" version: "1.0.4"
flutter_plugin_android_lifecycle: flutter_plugin_android_lifecycle:
dependency: transitive dependency: transitive
description: description:
name: flutter_plugin_android_lifecycle name: flutter_plugin_android_lifecycle
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.3" version: "2.0.3"
flutter_staggered_animations: flutter_staggered_animations:
dependency: "direct main" dependency: "direct main"
description: description:
name: flutter_staggered_animations name: flutter_staggered_animations
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.0.0" version: "1.0.0"
flutter_test: flutter_test:
@@ -162,168 +162,168 @@ packages:
dependency: "direct main" dependency: "direct main"
description: description:
name: get_it name: get_it
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "7.2.0" version: "7.2.0"
hive: hive:
dependency: "direct main" dependency: "direct main"
description: description:
name: hive name: hive
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.4" version: "2.0.4"
hive_flutter: hive_flutter:
dependency: "direct main" dependency: "direct main"
description: description:
name: hive_flutter name: hive_flutter
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.1.0" version: "1.1.0"
http: http:
dependency: transitive dependency: transitive
description: description:
name: http name: http
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.13.3" version: "0.13.3"
http_client_helper: http_client_helper:
dependency: transitive dependency: transitive
description: description:
name: http_client_helper name: http_client_helper
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.2" version: "2.0.2"
http_parser: http_parser:
dependency: transitive dependency: transitive
description: description:
name: http_parser name: http_parser
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "4.0.0" version: "4.0.0"
intl: intl:
dependency: transitive dependency: transitive
description: description:
name: intl name: intl
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.17.0" version: "0.17.0"
js: js:
dependency: transitive dependency: transitive
description: description:
name: js name: js
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.6.3" version: "0.6.3"
lints: lints:
dependency: transitive dependency: transitive
description: description:
name: lints name: lints
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.0.1" version: "1.0.1"
logging: logging:
dependency: transitive dependency: transitive
description: description:
name: logging name: logging
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.0.1" version: "1.0.2"
matcher: matcher:
dependency: transitive dependency: transitive
description: description:
name: matcher name: matcher
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.12.10" version: "0.12.10"
meta: meta:
dependency: transitive dependency: transitive
description: description:
name: meta name: meta
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.7.0" version: "1.7.0"
nested: nested:
dependency: transitive dependency: transitive
description: description:
name: nested name: nested
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.0.0" version: "1.0.0"
path: path:
dependency: transitive dependency: transitive
description: description:
name: path name: path
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.8.0" version: "1.8.0"
path_provider: path_provider:
dependency: transitive dependency: transitive
description: description:
name: path_provider name: path_provider
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.3" version: "2.0.4"
path_provider_linux: path_provider_linux:
dependency: transitive dependency: transitive
description: description:
name: path_provider_linux name: path_provider_linux
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.2" version: "2.1.0"
path_provider_macos: path_provider_macos:
dependency: transitive dependency: transitive
description: description:
name: path_provider_macos name: path_provider_macos
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.2" version: "2.0.2"
path_provider_platform_interface: path_provider_platform_interface:
dependency: transitive dependency: transitive
description: description:
name: path_provider_platform_interface name: path_provider_platform_interface
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.1" version: "2.0.1"
path_provider_windows: path_provider_windows:
dependency: transitive dependency: transitive
description: description:
name: path_provider_windows name: path_provider_windows
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.3" version: "2.0.3"
pedantic: pedantic:
dependency: transitive dependency: transitive
description: description:
name: pedantic name: pedantic
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.11.1" version: "1.11.1"
platform: platform:
dependency: transitive dependency: transitive
description: description:
name: platform name: platform
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "3.0.2" version: "3.0.2"
plugin_platform_interface: plugin_platform_interface:
dependency: transitive dependency: transitive
description: description:
name: plugin_platform_interface name: plugin_platform_interface
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.1" version: "2.0.1"
process: process:
dependency: transitive dependency: transitive
description: description:
name: process name: process
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "4.2.3" version: "4.2.3"
provider: provider:
dependency: "direct main" dependency: "direct main"
description: description:
name: provider name: provider
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "6.0.0" version: "6.0.0"
sky_engine: sky_engine:
@@ -335,126 +335,126 @@ packages:
dependency: transitive dependency: transitive
description: description:
name: source_span name: source_span
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.8.1" version: "1.8.1"
ssh2: ssh2:
dependency: "direct main" dependency: "direct main"
description: description:
name: ssh2 name: ssh2
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.2.2" version: "2.2.2"
stack_trace: stack_trace:
dependency: transitive dependency: transitive
description: description:
name: stack_trace name: stack_trace
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.10.0" version: "1.10.0"
stream_channel: stream_channel:
dependency: transitive dependency: transitive
description: description:
name: stream_channel name: stream_channel
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.1.0" version: "2.1.0"
string_scanner: string_scanner:
dependency: transitive dependency: transitive
description: description:
name: string_scanner name: string_scanner
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.1.0" version: "1.1.0"
term_glyph: term_glyph:
dependency: transitive dependency: transitive
description: description:
name: term_glyph name: term_glyph
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.2.0" version: "1.2.0"
test_api: test_api:
dependency: transitive dependency: transitive
description: description:
name: test_api name: test_api
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.4.2" version: "0.4.2"
typed_data: typed_data:
dependency: transitive dependency: transitive
description: description:
name: typed_data name: typed_data
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "1.3.0" version: "1.3.0"
url_launcher: url_launcher:
dependency: "direct main" dependency: "direct main"
description: description:
name: url_launcher name: url_launcher
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "6.0.10" version: "6.0.10"
url_launcher_linux: url_launcher_linux:
dependency: transitive dependency: transitive
description: description:
name: url_launcher_linux name: url_launcher_linux
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.2" version: "2.0.2"
url_launcher_macos: url_launcher_macos:
dependency: transitive dependency: transitive
description: description:
name: url_launcher_macos name: url_launcher_macos
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.2" version: "2.0.2"
url_launcher_platform_interface: url_launcher_platform_interface:
dependency: transitive dependency: transitive
description: description:
name: url_launcher_platform_interface name: url_launcher_platform_interface
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.4" version: "2.0.4"
url_launcher_web: url_launcher_web:
dependency: transitive dependency: transitive
description: description:
name: url_launcher_web name: url_launcher_web
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.4" version: "2.0.4"
url_launcher_windows: url_launcher_windows:
dependency: transitive dependency: transitive
description: description:
name: url_launcher_windows name: url_launcher_windows
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.0.2" version: "2.0.2"
uuid: uuid:
dependency: transitive dependency: transitive
description: description:
name: uuid name: uuid
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "3.0.4" version: "3.0.4"
vector_math: vector_math:
dependency: transitive dependency: transitive
description: description:
name: vector_math name: vector_math
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.1.0" version: "2.1.0"
win32: win32:
dependency: transitive dependency: transitive
description: description:
name: win32 name: win32
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "2.2.9" version: "2.2.9"
xdg_directories: xdg_directories:
dependency: transitive dependency: transitive
description: description:
name: xdg_directories name: xdg_directories
url: "https://pub.flutter-io.cn" url: "https://pub.dartlang.org"
source: hosted source: hosted
version: "0.2.0" version: "0.2.0"
sdks: sdks: