From 59f27616fdb72a118a1fb9221ee5d751f07a0023 Mon Sep 17 00:00:00 2001 From: wanghongenpin Date: Sat, 27 Apr 2024 19:38:46 +0800 Subject: [PATCH] copy host menu --- .gitignore | 3 +- .../com/network/proxy/vpn/Connection.kt | 9 + .../network/proxy/vpn/ConnectionManager.kt | 15 +- lib/l10n/app_en.arb | 1 + lib/l10n/app_zh.arb | 1 + lib/network/handler.dart | 2 +- lib/ui/content/panel.dart | 2 +- lib/ui/desktop/left/list.dart | 8 + lib/ui/desktop/toolbar/setting/filter.dart | 6 +- lib/ui/mobile/request/list.dart | 12 +- lib/ui/mobile/setting/filter.dart | 8 +- lib/utils/lang.dart | 4 + pubspec.lock | 840 ------------------ 13 files changed, 57 insertions(+), 854 deletions(-) delete mode 100644 pubspec.lock diff --git a/.gitignore b/.gitignore index 87b2f4e..a21dcae 100644 --- a/.gitignore +++ b/.gitignore @@ -43,4 +43,5 @@ app.*.map.json /android/app/profile /android/app/release -l10n_errors.txt \ No newline at end of file +l10n_errors.txt +pubspec.lock \ No newline at end of file diff --git a/android/app/src/main/kotlin/com/network/proxy/vpn/Connection.kt b/android/app/src/main/kotlin/com/network/proxy/vpn/Connection.kt index 1211ccc..e0f9bd2 100644 --- a/android/app/src/main/kotlin/com/network/proxy/vpn/Connection.kt +++ b/android/app/src/main/kotlin/com/network/proxy/vpn/Connection.kt @@ -175,5 +175,14 @@ class Connection( } } + override fun toString(): String { + return "Connection{" + + "protocol=" + protocol + + ", sourceIp=" + PacketUtil.intToIPAddress(sourceIp) + + ", sourcePort=" + sourcePort + + ", destinationIp=" + PacketUtil.intToIPAddress(destinationIp) + + ", destinationPort=" + destinationPort + + '}' + } } \ No newline at end of file diff --git a/android/app/src/main/kotlin/com/network/proxy/vpn/ConnectionManager.kt b/android/app/src/main/kotlin/com/network/proxy/vpn/ConnectionManager.kt index ded306d..5d4aac0 100644 --- a/android/app/src/main/kotlin/com/network/proxy/vpn/ConnectionManager.kt +++ b/android/app/src/main/kotlin/com/network/proxy/vpn/ConnectionManager.kt @@ -27,7 +27,7 @@ class ConnectionManager private constructor() : CloseableConnection { private val table: ConcurrentMap = ConcurrentHashMap() var proxyAddress: InetSocketAddress? = null - var DEFAULT_PORTS: List = listOf( + private val DEFAULT_PORTS: List = listOf( 80, // HTTP 443, // HTTPS 8080, // Common local dev ports @@ -48,6 +48,8 @@ class ConnectionManager private constructor() : CloseableConnection { fun closeConnection(protocol: Protocol, ip: Int, port: Int, srcIp: Int, srcPort: Int) { val key = Connection.getConnectionKey(protocol, ip, port, srcIp, srcPort) val connection: Connection? = table.remove(key) + Log.d(TAG, "close connection $key") + connection?.let { val channel = connection.channel try { @@ -94,14 +96,11 @@ class ConnectionManager private constructor() : CloseableConnection { connection.channel = channel - val socketAddress: SocketAddress? = null -// if (!DEFAULT_PORTS.contains(port)) { -// socketAddress = new InetSocketAddress(ips, port); -// } + var socketAddress: SocketAddress? = null + if (DEFAULT_PORTS.contains(port)) { + socketAddress = proxyAddress + } - // if (!DEFAULT_PORTS.contains(port)) { -// socketAddress = new InetSocketAddress(ips, port); -// } connection.isInitConnect = socketAddress != null if (socketAddress != null) { diff --git a/lib/l10n/app_en.arb b/lib/l10n/app_en.arb index fde5463..fa7b9c5 100644 --- a/lib/l10n/app_en.arb +++ b/lib/l10n/app_en.arb @@ -119,6 +119,7 @@ "domainListSubtitle": "Last Request Time: {time}, Count: {count}", "copy": "Copy", + "copyHost": "Copy Host", "copyUrl": "Copy URL", "copyRequestResponse": "Copy Request and Response", "copyCurl": "Copy cURL", diff --git a/lib/l10n/app_zh.arb b/lib/l10n/app_zh.arb index a0c35c6..d3a60ea 100644 --- a/lib/l10n/app_zh.arb +++ b/lib/l10n/app_zh.arb @@ -119,6 +119,7 @@ "domainListSubtitle": "最后请求时间: {time}, 次数: {count}", "copy": "复制", + "copyHost": "复制域名", "copyUrl": "复制URL", "copyRequestResponse": "复制请求和响应", "copyCurl": "复制 cURL 请求", diff --git a/lib/network/handler.dart b/lib/network/handler.dart index 6d61658..d1b8e32 100644 --- a/lib/network/handler.dart +++ b/lib/network/handler.dart @@ -154,7 +154,7 @@ class HttpProxyChannelHandler extends ChannelHandler { var redirectUri = UriBuild.build(redirectUrl, params: httpRequest.queries); httpRequest.uri = redirectUri.toString(); - httpRequest.headers.host = redirectUri.host; + httpRequest.headers.host = redirectUri.hasPort ? "${redirectUri.host}:${redirectUri.port}" : redirectUri.host; var redirectChannel = await HttpClients.connect(Uri.parse(redirectUrl), proxyHandler, channelContext); channelContext.serverChannel = redirectChannel; await redirectChannel.write(httpRequest); diff --git a/lib/ui/content/panel.dart b/lib/ui/content/panel.dart index 25fc709..24a74cc 100644 --- a/lib/ui/content/panel.dart +++ b/lib/ui/content/panel.dart @@ -197,7 +197,7 @@ class NetworkTabState extends State with SingleTickerProvi const SizedBox(height: 20), rowWidget("Remote Address", response?.remoteAddress), const SizedBox(height: 20), - rowWidget("Request Time", request.requestTime.format()), + rowWidget("Request Time", request.requestTime.formatMillisecond()), const SizedBox(height: 20), rowWidget("Duration", response?.costTime()), const SizedBox(height: 20), diff --git a/lib/ui/desktop/left/list.dart b/lib/ui/desktop/left/list.dart index 5245608..083fd75 100644 --- a/lib/ui/desktop/left/list.dart +++ b/lib/ui/desktop/left/list.dart @@ -3,6 +3,7 @@ import 'dart:io'; import 'package:file_selector/file_selector.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:flutter_toastr/flutter_toastr.dart'; import 'package:network_proxy/network/bin/configuration.dart'; @@ -401,6 +402,13 @@ class _DomainRequestsState extends State { context, details.globalPosition, items: [ + CustomPopupMenuItem( + height: 35, + child: Text(localizations.copyHost, style: const TextStyle(fontSize: 13)), + onTap: () { + Clipboard.setData(ClipboardData(text: Uri.parse(widget.domain).host)); + FlutterToastr.show(localizations.copied, context); + }), CustomPopupMenuItem( height: 35, child: Text(localizations.domainBlacklist, style: const TextStyle(fontSize: 13)), diff --git a/lib/ui/desktop/toolbar/setting/filter.dart b/lib/ui/desktop/toolbar/setting/filter.dart index 265a7d5..edd2409 100644 --- a/lib/ui/desktop/toolbar/setting/filter.dart +++ b/lib/ui/desktop/toolbar/setting/filter.dart @@ -302,7 +302,7 @@ class _DomainListState extends State { highlightColor: Colors.transparent, splashColor: Colors.transparent, hoverColor: primaryColor.withOpacity(0.3), - onSecondaryTapDown: (details) => showMenus(details, index), + onSecondaryTapDown: (details) => showMenus(details, index), //right click menus onDoubleTap: () => showEdit(index), onHover: (hover) { if (isPress && selected[index] != true) { @@ -425,6 +425,10 @@ class _DomainListState extends State { }); showContextMenu(context, details.globalPosition, items: [ + PopupMenuItem(height: 35, child: Text(localizations.copy), onTap: () { + Clipboard.setData(ClipboardData(text: widget.hostList.list[index].pattern.replaceAll(".*", "*"))); + FlutterToastr.show(localizations.copied, context); + }), PopupMenuItem(height: 35, child: Text(localizations.edit), onTap: () => showEdit(index)), PopupMenuItem(height: 35, onTap: () => export([index]), child: Text(localizations.export)), const PopupMenuDivider(), diff --git a/lib/ui/mobile/request/list.dart b/lib/ui/mobile/request/list.dart index 90d1cb4..448da2d 100644 --- a/lib/ui/mobile/request/list.dart +++ b/lib/ui/mobile/request/list.dart @@ -3,6 +3,7 @@ import 'dart:convert'; import 'package:date_format/date_format.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:flutter_toastr/flutter_toastr.dart'; import 'package:network_proxy/network/bin/configuration.dart'; @@ -422,7 +423,7 @@ class DomainListState extends State with AutomaticKeepAliveClientMix trailing: const Icon(Icons.chevron_right), subtitle: Text(localizations.domainListSubtitle(value?.length ?? '', time), maxLines: 1, overflow: TextOverflow.ellipsis), - onLongPress: () => menu(index), + onLongPress: () => menu(index), // show menus contentPadding: const EdgeInsets.only(left: 10), onTap: () { Navigator.push(context, MaterialPageRoute(builder: (context) { @@ -450,6 +451,15 @@ class DomainListState extends State with AutomaticKeepAliveClientMix return Wrap( alignment: WrapAlignment.center, children: [ + TextButton( + child: SizedBox( + width: double.infinity, child: Text(localizations.copyHost, textAlign: TextAlign.center)), + onPressed: () { + Clipboard.setData(ClipboardData(text: hostAndPort.host)); + FlutterToastr.show(localizations.copied, context); + Navigator.of(context).pop(); + }), + const Divider(thickness: 0.5), TextButton( child: SizedBox( width: double.infinity, child: Text(localizations.addBlacklist, textAlign: TextAlign.center)), diff --git a/lib/ui/mobile/setting/filter.dart b/lib/ui/mobile/setting/filter.dart index d0b64ce..40ef10f 100644 --- a/lib/ui/mobile/setting/filter.dart +++ b/lib/ui/mobile/setting/filter.dart @@ -3,6 +3,7 @@ import 'dart:convert'; import 'package:file_selector/file_selector.dart'; import 'package:flutter/material.dart'; +import 'package:flutter/services.dart'; import 'package:flutter_gen/gen_l10n/app_localizations.dart'; import 'package:flutter_toastr/flutter_toastr.dart'; import 'package:network_proxy/network/bin/configuration.dart'; @@ -299,7 +300,7 @@ class _DomainListState extends State { highlightColor: Colors.transparent, splashColor: Colors.transparent, hoverColor: primaryColor.withOpacity(0.3), - onLongPress: () => showMenus(index), + onLongPress: () => showMenus(index), // menus onDoubleTap: () => showEdit(index), onTap: () { if (multiple) { @@ -363,6 +364,11 @@ class _DomainListState extends State { setState(() => multiple = true); }), const Divider(thickness: 0.5, height: 5), + BottomSheetItem(text: localizations.copy, onPressed: () { + Clipboard.setData(ClipboardData(text: widget.hostList.list[index].pattern.replaceAll(".*", "*"))); + FlutterToastr.show(localizations.copied, context); + }), + const Divider(thickness: 0.5, height: 5), BottomSheetItem(text: localizations.edit, onPressed: () => showEdit(index)), const Divider(thickness: 0.5, height: 5), BottomSheetItem(onPressed: () => export([index]), text: localizations.share), diff --git a/lib/utils/lang.dart b/lib/utils/lang.dart index 4487396..98c27c1 100644 --- a/lib/utils/lang.dart +++ b/lib/utils/lang.dart @@ -18,6 +18,10 @@ extension DateTimeFormat on DateTime { return formatDate(this, [yyyy, '-', mm, '-', dd, ' ', HH, ':', nn, ':', ss]); } + String formatMillisecond() { + return formatDate(this, [yyyy, '-', mm, '-', dd, ' ', HH, ':', nn, ':', ss, '.', SSS]); + } + String timeFormat() { return formatDate(this, [HH, ':', nn, ':', ss]); } diff --git a/pubspec.lock b/pubspec.lock deleted file mode 100644 index 71f89d9..0000000 --- a/pubspec.lock +++ /dev/null @@ -1,840 +0,0 @@ -# Generated by pub -# See https://dart.dev/tools/pub/glossary#lockfile -packages: - async: - dependency: transitive - description: - name: async - sha256: "947bfcf187f74dbc5e146c9eb9c0f10c9f8b30743e341481c1e2ed3ecc18c20c" - url: "https://pub.flutter-io.cn" - source: hosted - version: "2.11.0" - autotrie: - dependency: transitive - description: - name: autotrie - sha256: "55da6faefb53cfcb0abb2f2ca8636123fb40e35286bb57440d2cf467568188f8" - url: "https://pub.flutter-io.cn" - source: hosted - version: "2.0.0" - basic_utils: - dependency: "direct main" - description: - name: basic_utils - sha256: "2064b21d3c41ed7654bc82cc476fd65542e04d60059b74d5eed490a4da08fc6c" - url: "https://pub.flutter-io.cn" - source: hosted - version: "5.7.0" - boolean_selector: - dependency: transitive - description: - name: boolean_selector - sha256: "6cfb5af12253eaf2b368f07bacc5a80d1301a071c73360d746b7f2e32d762c66" - url: "https://pub.flutter-io.cn" - source: hosted - version: "2.1.1" - brotli: - dependency: "direct main" - description: - name: brotli - sha256: "7f891558ed779aab2bed874f0a36b8123f9ff3f19cf6efbee89e18ed294945ae" - url: "https://pub.flutter-io.cn" - source: hosted - version: "0.6.0" - characters: - dependency: transitive - description: - name: characters - sha256: "04a925763edad70e8443c99234dc3328f442e811f1d8fd1a72f1c8ad0f69a605" - url: "https://pub.flutter-io.cn" - source: hosted - version: "1.3.0" - charcode: - dependency: transitive - description: - name: charcode - sha256: fb98c0f6d12c920a02ee2d998da788bca066ca5f148492b7085ee23372b12306 - url: "https://pub.flutter-io.cn" - source: hosted - version: "1.3.1" - clock: - dependency: transitive - description: - name: clock - sha256: cb6d7f03e1de671e34607e909a7213e31d7752be4fb66a86d29fe1eb14bfb5cf - url: "https://pub.flutter-io.cn" - source: hosted - version: "1.1.1" - collection: - dependency: transitive - description: - name: collection - sha256: ee67cb0715911d28db6bf4af1026078bd6f0128b07a5f66fb2ed94ec6783c09a - url: "https://pub.flutter-io.cn" - source: hosted - version: "1.18.0" - convert: - dependency: transitive - description: - name: convert - sha256: "0f08b14755d163f6e2134cb58222dd25ea2a2ee8a195e53983d57c075324d592" - url: "https://pub.flutter-io.cn" - source: hosted - version: "3.1.1" - cross_file: - dependency: transitive - description: - name: cross_file - sha256: "55d7b444feb71301ef6b8838dbc1ae02e63dd48c8773f3810ff53bb1e2945b32" - url: "https://pub.flutter-io.cn" - source: hosted - version: "0.3.4+1" - crypto: - dependency: "direct main" - description: - name: crypto - sha256: ff625774173754681d66daaf4a448684fb04b78f902da9cb3d308c19cc5e8bab - url: "https://pub.flutter-io.cn" - source: hosted - version: "3.0.3" - cupertino_icons: - dependency: "direct main" - description: - name: cupertino_icons - sha256: d57953e10f9f8327ce64a508a355f0b1ec902193f66288e8cb5070e7c47eeb2d - url: "https://pub.flutter-io.cn" - source: hosted - version: "1.0.6" - date_format: - dependency: "direct main" - description: - name: date_format - sha256: "8e5154ca363411847220c8cbc43afcf69c08e8debe40ba09d57710c25711760c" - url: "https://pub.flutter-io.cn" - source: hosted - version: "2.0.7" - desktop_multi_window: - dependency: "direct main" - description: - path: "packages/desktop_multi_window" - ref: HEAD - resolved-ref: d9a33eb7bcf71989d5188b84671c69b46308243d - url: "https://gitee.com/wanghongenpin/flutter-plugins.git" - source: git - version: "0.2.0" - easy_permission: - dependency: "direct main" - description: - name: easy_permission - sha256: "324ade4e67b316a2d77a9f44240e2bb72f5a4a4919dbef3a5d832baa6473f7eb" - url: "https://pub.flutter-io.cn" - source: hosted - version: "1.0.0" - equatable: - dependency: transitive - description: - name: equatable - sha256: c2b87cb7756efdf69892005af546c56c0b5037f54d2a88269b4f347a505e3ca2 - url: "https://pub.flutter-io.cn" - source: hosted - version: "2.0.5" - fake_async: - dependency: transitive - description: - name: fake_async - sha256: "511392330127add0b769b75a987850d136345d9227c6b94c96a04cf4a391bf78" - url: "https://pub.flutter-io.cn" - source: hosted - version: "1.3.1" - ffi: - dependency: transitive - description: - name: ffi - sha256: "493f37e7df1804778ff3a53bd691d8692ddf69702cf4c1c1096a2e41b4779e21" - url: "https://pub.flutter-io.cn" - source: hosted - version: "2.1.2" - file: - dependency: transitive - description: - name: file - sha256: "5fc22d7c25582e38ad9a8515372cd9a93834027aacf1801cf01164dac0ffa08c" - url: "https://pub.flutter-io.cn" - source: hosted - version: "7.0.0" - file_picker: - dependency: "direct main" - description: - name: file_picker - sha256: d1d0ac3966b36dc3e66eeefb40280c17feb87fa2099c6e22e6a1fc959327bd03 - url: "https://pub.flutter-io.cn" - source: hosted - version: "8.0.0+1" - file_selector: - dependency: "direct main" - description: - name: file_selector - sha256: "5019692b593455127794d5718304ff1ae15447dea286cdda9f0db2a796a1b828" - url: "https://pub.flutter-io.cn" - source: hosted - version: "1.0.3" - file_selector_android: - dependency: transitive - description: - name: file_selector_android - sha256: "1cd66575f063b689e041aec836905ba7be18d76c9f0634d0d75daec825f67095" - url: "https://pub.flutter-io.cn" - source: hosted - version: "0.5.0+7" - file_selector_ios: - dependency: transitive - description: - name: file_selector_ios - sha256: b015154e6d9fddbc4d08916794df170b44531798c8dd709a026df162d07ad81d - url: "https://pub.flutter-io.cn" - source: hosted - version: "0.5.1+8" - file_selector_linux: - dependency: transitive - description: - name: file_selector_linux - sha256: "045d372bf19b02aeb69cacf8b4009555fb5f6f0b7ad8016e5f46dd1387ddd492" - url: "https://pub.flutter-io.cn" - source: hosted - version: "0.9.2+1" - file_selector_macos: - dependency: transitive - description: - name: file_selector_macos - sha256: b15c3da8bd4908b9918111fa486903f5808e388b8d1c559949f584725a6594d6 - url: "https://pub.flutter-io.cn" - source: hosted - version: "0.9.3+3" - file_selector_platform_interface: - dependency: transitive - description: - name: file_selector_platform_interface - sha256: a3994c26f10378a039faa11de174d7b78eb8f79e4dd0af2a451410c1a5c3f66b - url: "https://pub.flutter-io.cn" - source: hosted - version: "2.6.2" - file_selector_web: - dependency: transitive - description: - name: file_selector_web - sha256: "619e431b224711a3869e30dbd7d516f5f5a4f04b265013a50912f39e1abc88c8" - url: "https://pub.flutter-io.cn" - source: hosted - version: "0.9.4+1" - file_selector_windows: - dependency: transitive - description: - name: file_selector_windows - sha256: d3547240c20cabf205c7c7f01a50ecdbc413755814d6677f3cb366f04abcead0 - url: "https://pub.flutter-io.cn" - source: hosted - version: "0.9.3+1" - fixnum: - dependency: transitive - description: - name: fixnum - sha256: "25517a4deb0c03aa0f32fd12db525856438902d9c16536311e76cdc57b31d7d1" - url: "https://pub.flutter-io.cn" - source: hosted - version: "1.1.0" - flutter: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_barcode_scanner: - dependency: "direct main" - description: - name: flutter_barcode_scanner - sha256: a4ba37daf9933f451a5e812c753ddd045d6354e4a3280342d895b07fecaab3fa - url: "https://pub.flutter-io.cn" - source: hosted - version: "2.0.0" - flutter_code_editor: - dependency: "direct main" - description: - name: flutter_code_editor - sha256: "56673b62f2d844c1a2b0cf43a4495be0d6123111de5f33887781d2d3b39a77b6" - url: "https://pub.flutter-io.cn" - source: hosted - version: "0.3.1" - flutter_desktop_context_menu: - dependency: "direct main" - description: - name: flutter_desktop_context_menu - sha256: "31bd0f8d26a807abc3904f0300433c4a1cd0d071a944c1d8b10b1bb8b5e7e5f0" - url: "https://pub.flutter-io.cn" - source: hosted - version: "0.2.0" - flutter_highlight: - dependency: transitive - description: - name: flutter_highlight - sha256: "7b96333867aa07e122e245c033b8ad622e4e3a42a1a2372cbb098a2541d8782c" - url: "https://pub.flutter-io.cn" - source: hosted - version: "0.7.0" - flutter_js: - dependency: "direct main" - description: - name: flutter_js - sha256: "5bf5db354fe78fe24cb90a5fa6b4423d38712440c88e3445c3dc88bc134c452f" - url: "https://pub.flutter-io.cn" - source: hosted - version: "0.8.0" - flutter_lints: - dependency: "direct dev" - description: - name: flutter_lints - sha256: e2a421b7e59244faef694ba7b30562e489c2b489866e505074eb005cd7060db7 - url: "https://pub.flutter-io.cn" - source: hosted - version: "3.0.1" - flutter_localizations: - dependency: "direct main" - description: flutter - source: sdk - version: "0.0.0" - flutter_plugin_android_lifecycle: - dependency: transitive - description: - name: flutter_plugin_android_lifecycle - sha256: b068ffc46f82a55844acfa4fdbb61fad72fa2aef0905548419d97f0f95c456da - url: "https://pub.flutter-io.cn" - source: hosted - version: "2.0.17" - flutter_test: - dependency: "direct dev" - description: flutter - source: sdk - version: "0.0.0" - flutter_toastr: - dependency: "direct main" - description: - name: flutter_toastr - sha256: "60e4af64bfba2c43ca4bedf09d2e84ba36ac242f0b13ac26681eb547ccd8489e" - url: "https://pub.flutter-io.cn" - source: hosted - version: "1.0.3" - flutter_web_plugins: - dependency: transitive - description: flutter - source: sdk - version: "0.0.0" - highlight: - dependency: transitive - description: - name: highlight - sha256: "5353a83ffe3e3eca7df0abfb72dcf3fa66cc56b953728e7113ad4ad88497cf21" - url: "https://pub.flutter-io.cn" - source: hosted - version: "0.7.0" - hive: - dependency: transitive - description: - name: hive - sha256: "8dcf6db979d7933da8217edcec84e9df1bdb4e4edc7fc77dbd5aa74356d6d941" - url: "https://pub.flutter-io.cn" - source: hosted - version: "2.2.3" - http: - dependency: transitive - description: - name: http - sha256: "761a297c042deedc1ffbb156d6e2af13886bb305c2a343a4d972504cd67dd938" - url: "https://pub.flutter-io.cn" - source: hosted - version: "1.2.1" - http_parser: - dependency: transitive - description: - name: http_parser - sha256: "2aa08ce0341cc9b354a498388e30986515406668dbcc4f7c950c3e715496693b" - url: "https://pub.flutter-io.cn" - source: hosted - version: "4.0.2" - intl: - dependency: "direct main" - description: - name: intl - sha256: "3bc132a9dbce73a7e4a21a17d06e1878839ffbf975568bc875c60537824b0c4d" - url: "https://pub.flutter-io.cn" - source: hosted - version: "0.18.1" - js: - dependency: transitive - description: - name: js - sha256: c1b2e9b5ea78c45e1a0788d29606ba27dc5f71f019f32ca5140f61ef071838cf - url: "https://pub.flutter-io.cn" - source: hosted - version: "0.7.1" - json_annotation: - dependency: transitive - description: - name: json_annotation - sha256: b10a7b2ff83d83c777edba3c6a0f97045ddadd56c944e1a23a3fdf43a1bf4467 - url: "https://pub.flutter-io.cn" - source: hosted - version: "4.8.1" - leak_tracker: - dependency: transitive - description: - name: leak_tracker - sha256: "78eb209deea09858f5269f5a5b02be4049535f568c07b275096836f01ea323fa" - url: "https://pub.flutter-io.cn" - source: hosted - version: "10.0.0" - leak_tracker_flutter_testing: - dependency: transitive - description: - name: leak_tracker_flutter_testing - sha256: b46c5e37c19120a8a01918cfaf293547f47269f7cb4b0058f21531c2465d6ef0 - url: "https://pub.flutter-io.cn" - source: hosted - version: "2.0.1" - leak_tracker_testing: - dependency: transitive - description: - name: leak_tracker_testing - sha256: a597f72a664dbd293f3bfc51f9ba69816f84dcd403cdac7066cb3f6003f3ab47 - url: "https://pub.flutter-io.cn" - source: hosted - version: "2.0.1" - linked_scroll_controller: - dependency: transitive - description: - name: linked_scroll_controller - sha256: e6020062bcf4ffc907ee7fd090fa971e65d8dfaac3c62baf601a3ced0b37986a - url: "https://pub.flutter-io.cn" - source: hosted - version: "0.2.0" - lints: - dependency: transitive - description: - name: lints - sha256: cbf8d4b858bb0134ef3ef87841abdf8d63bfc255c266b7bf6b39daa1085c4290 - url: "https://pub.flutter-io.cn" - source: hosted - version: "3.0.0" - logger: - dependency: "direct main" - description: - name: logger - sha256: "8c94b8c219e7e50194efc8771cd0e9f10807d8d3e219af473d89b06cc2ee4e04" - url: "https://pub.flutter-io.cn" - source: hosted - version: "2.2.0" - logging: - dependency: transitive - description: - name: logging - sha256: "623a88c9594aa774443aa3eb2d41807a48486b5613e67599fb4c41c0ad47c340" - url: "https://pub.flutter-io.cn" - source: hosted - version: "1.2.0" - matcher: - dependency: transitive - description: - name: matcher - sha256: d2323aa2060500f906aa31a895b4030b6da3ebdcc5619d14ce1aada65cd161cb - url: "https://pub.flutter-io.cn" - source: hosted - version: "0.12.16+1" - material_color_utilities: - dependency: transitive - description: - name: material_color_utilities - sha256: "0e0a020085b65b6083975e499759762399b4475f766c21668c4ecca34ea74e5a" - url: "https://pub.flutter-io.cn" - source: hosted - version: "0.8.0" - meta: - dependency: transitive - description: - name: meta - sha256: d584fa6707a52763a52446f02cc621b077888fb63b93bbcb1143a7be5a0c0c04 - url: "https://pub.flutter-io.cn" - source: hosted - version: "1.11.0" - mime: - dependency: transitive - description: - name: mime - sha256: "2e123074287cc9fd6c09de8336dae606d1ddb88d9ac47358826db698c176a1f2" - url: "https://pub.flutter-io.cn" - source: hosted - version: "1.0.5" - mocktail: - dependency: transitive - description: - name: mocktail - sha256: c4b5007d91ca4f67256e720cb1b6d704e79a510183a12fa551021f652577dce6 - url: "https://pub.flutter-io.cn" - source: hosted - version: "1.0.3" - path: - dependency: transitive - description: - name: path - sha256: "087ce49c3f0dc39180befefc60fdb4acd8f8620e5682fe2476afd0b3688bb4af" - url: "https://pub.flutter-io.cn" - source: hosted - version: "1.9.0" - path_provider: - dependency: "direct main" - description: - name: path_provider - sha256: b27217933eeeba8ff24845c34003b003b2b22151de3c908d0e679e8fe1aa078b - url: "https://pub.flutter-io.cn" - source: hosted - version: "2.1.2" - path_provider_android: - dependency: transitive - description: - name: path_provider_android - sha256: "477184d672607c0a3bf68fbbf601805f92ef79c82b64b4d6eb318cbca4c48668" - url: "https://pub.flutter-io.cn" - source: hosted - version: "2.2.2" - path_provider_foundation: - dependency: transitive - description: - name: path_provider_foundation - sha256: "5a7999be66e000916500be4f15a3633ebceb8302719b47b9cc49ce924125350f" - url: "https://pub.flutter-io.cn" - source: hosted - version: "2.3.2" - path_provider_linux: - dependency: transitive - description: - name: path_provider_linux - sha256: f7a1fe3a634fe7734c8d3f2766ad746ae2a2884abe22e241a8b301bf5cac3279 - url: "https://pub.flutter-io.cn" - source: hosted - version: "2.2.1" - path_provider_platform_interface: - dependency: transitive - description: - name: path_provider_platform_interface - sha256: "88f5779f72ba699763fa3a3b06aa4bf6de76c8e5de842cf6f29e2e06476c2334" - url: "https://pub.flutter-io.cn" - source: hosted - version: "2.1.2" - path_provider_windows: - dependency: transitive - description: - name: path_provider_windows - sha256: "8bc9f22eee8690981c22aa7fc602f5c85b497a6fb2ceb35ee5a5e5ed85ad8170" - url: "https://pub.flutter-io.cn" - source: hosted - version: "2.2.1" - platform: - dependency: transitive - description: - name: platform - sha256: "12220bb4b65720483f8fa9450b4332347737cf8213dd2840d8b2c823e47243ec" - url: "https://pub.flutter-io.cn" - source: hosted - version: "3.1.4" - plugin_platform_interface: - dependency: transitive - description: - name: plugin_platform_interface - sha256: "4820fbfdb9478b1ebae27888254d445073732dae3d6ea81f0b7e06d5dedc3f02" - url: "https://pub.flutter-io.cn" - source: hosted - version: "2.1.8" - pointycastle: - dependency: transitive - description: - name: pointycastle - sha256: "43ac87de6e10afabc85c445745a7b799e04de84cebaa4fd7bf55a5e1e9604d29" - url: "https://pub.flutter-io.cn" - source: hosted - version: "3.7.4" - proxy_manager: - dependency: "direct main" - description: - name: proxy_manager - sha256: "4cdb8853bcedc1a6879c6d940d624d740e1c76ee6b83377b13270f96a8415a37" - url: "https://pub.flutter-io.cn" - source: hosted - version: "0.0.3" - qr: - dependency: transitive - description: - name: qr - sha256: "64957a3930367bf97cc211a5af99551d630f2f4625e38af10edd6b19131b64b3" - url: "https://pub.flutter-io.cn" - source: hosted - version: "3.0.1" - qr_flutter: - dependency: "direct main" - description: - name: qr_flutter - sha256: "5095f0fc6e3f71d08adef8feccc8cea4f12eec18a2e31c2e8d82cb6019f4b097" - url: "https://pub.flutter-io.cn" - source: hosted - version: "4.1.0" - qrscan: - dependency: "direct main" - description: - name: qrscan - sha256: "0ee72eca0dcbc35ab74894010e3589c3675ddb7c5a551d5f29ab0d3bb1bfb135" - url: "https://pub.flutter-io.cn" - source: hosted - version: "0.3.3" - screen_retriever: - dependency: transitive - description: - name: screen_retriever - sha256: "6ee02c8a1158e6dae7ca430da79436e3b1c9563c8cf02f524af997c201ac2b90" - url: "https://pub.flutter-io.cn" - source: hosted - version: "0.1.9" - scrollable_positioned_list: - dependency: transitive - description: - name: scrollable_positioned_list - sha256: "1b54d5f1329a1e263269abc9e2543d90806131aa14fe7c6062a8054d57249287" - url: "https://pub.flutter-io.cn" - source: hosted - version: "0.3.8" - share_plus: - dependency: "direct main" - description: - name: share_plus - sha256: "05ec043470319bfbabe0adbc90d3a84cbff0426b9d9f3a6e2ad3e131fa5fa629" - url: "https://pub.flutter-io.cn" - source: hosted - version: "8.0.2" - share_plus_platform_interface: - dependency: transitive - description: - name: share_plus_platform_interface - sha256: "251eb156a8b5fa9ce033747d73535bf53911071f8d3b6f4f0b578505ce0d4496" - url: "https://pub.flutter-io.cn" - source: hosted - version: "3.4.0" - sky_engine: - dependency: transitive - description: flutter - source: sdk - version: "0.0.99" - source_span: - dependency: transitive - description: - name: source_span - sha256: "53e943d4206a5e30df338fd4c6e7a077e02254531b138a15aec3bd143c1a8b3c" - url: "https://pub.flutter-io.cn" - source: hosted - version: "1.10.0" - sprintf: - dependency: transitive - description: - name: sprintf - sha256: "1fc9ffe69d4df602376b52949af107d8f5703b77cda567c4d7d86a0693120f23" - url: "https://pub.flutter-io.cn" - source: hosted - version: "7.0.0" - stack_trace: - dependency: transitive - description: - name: stack_trace - sha256: "73713990125a6d93122541237550ee3352a2d84baad52d375a4cad2eb9b7ce0b" - url: "https://pub.flutter-io.cn" - source: hosted - version: "1.11.1" - stream_channel: - dependency: transitive - description: - name: stream_channel - sha256: ba2aa5d8cc609d96bbb2899c28934f9e1af5cddbd60a827822ea467161eb54e7 - url: "https://pub.flutter-io.cn" - source: hosted - version: "2.1.2" - string_scanner: - dependency: transitive - description: - name: string_scanner - sha256: "556692adab6cfa87322a115640c11f13cb77b3f076ddcc5d6ae3c20242bedcde" - url: "https://pub.flutter-io.cn" - source: hosted - version: "1.2.0" - sync_http: - dependency: transitive - description: - name: sync_http - sha256: "7f0cd72eca000d2e026bcd6f990b81d0ca06022ef4e32fb257b30d3d1014a961" - url: "https://pub.flutter-io.cn" - source: hosted - version: "0.3.1" - term_glyph: - dependency: transitive - description: - name: term_glyph - sha256: a29248a84fbb7c79282b40b8c72a1209db169a2e0542bce341da992fe1bc7e84 - url: "https://pub.flutter-io.cn" - source: hosted - version: "1.2.1" - test_api: - dependency: transitive - description: - name: test_api - sha256: "5c2f730018264d276c20e4f1503fd1308dfbbae39ec8ee63c5236311ac06954b" - url: "https://pub.flutter-io.cn" - source: hosted - version: "0.6.1" - tuple: - dependency: transitive - description: - name: tuple - sha256: a97ce2013f240b2f3807bcbaf218765b6f301c3eff91092bcfa23a039e7dd151 - url: "https://pub.flutter-io.cn" - source: hosted - version: "2.0.2" - typed_data: - dependency: transitive - description: - name: typed_data - sha256: facc8d6582f16042dd49f2463ff1bd6e2c9ef9f3d5da3d9b087e244a7b564b3c - url: "https://pub.flutter-io.cn" - source: hosted - version: "1.3.2" - url_launcher: - dependency: "direct main" - description: - name: url_launcher - sha256: "0ecc004c62fd3ed36a2ffcbe0dd9700aee63bd7532d0b642a488b1ec310f492e" - url: "https://pub.flutter-io.cn" - source: hosted - version: "6.2.5" - url_launcher_android: - dependency: transitive - description: - name: url_launcher_android - sha256: d4ed0711849dd8e33eb2dd69c25db0d0d3fdc37e0a62e629fe32f57a22db2745 - url: "https://pub.flutter-io.cn" - source: hosted - version: "6.3.0" - url_launcher_ios: - dependency: transitive - description: - name: url_launcher_ios - sha256: "9149d493b075ed740901f3ee844a38a00b33116c7c5c10d7fb27df8987fb51d5" - url: "https://pub.flutter-io.cn" - source: hosted - version: "6.2.5" - url_launcher_linux: - dependency: transitive - description: - name: url_launcher_linux - sha256: ab360eb661f8879369acac07b6bb3ff09d9471155357da8443fd5d3cf7363811 - url: "https://pub.flutter-io.cn" - source: hosted - version: "3.1.1" - url_launcher_macos: - dependency: transitive - description: - name: url_launcher_macos - sha256: b7244901ea3cf489c5335bdacda07264a6e960b1c1b1a9f91e4bc371d9e68234 - url: "https://pub.flutter-io.cn" - source: hosted - version: "3.1.0" - url_launcher_platform_interface: - dependency: transitive - description: - name: url_launcher_platform_interface - sha256: "552f8a1e663569be95a8190206a38187b531910283c3e982193e4f2733f01029" - url: "https://pub.flutter-io.cn" - source: hosted - version: "2.3.2" - url_launcher_web: - dependency: transitive - description: - name: url_launcher_web - sha256: "3692a459204a33e04bc94f5fb91158faf4f2c8903281ddd82915adecdb1a901d" - url: "https://pub.flutter-io.cn" - source: hosted - version: "2.3.0" - url_launcher_windows: - dependency: transitive - description: - name: url_launcher_windows - sha256: ecf9725510600aa2bb6d7ddabe16357691b6d2805f66216a97d1b881e21beff7 - url: "https://pub.flutter-io.cn" - source: hosted - version: "3.1.1" - uuid: - dependency: transitive - description: - name: uuid - sha256: cd210a09f7c18cbe5a02511718e0334de6559871052c90a90c0cca46a4aa81c8 - url: "https://pub.flutter-io.cn" - source: hosted - version: "4.3.3" - vector_math: - dependency: transitive - description: - name: vector_math - sha256: "80b3257d1492ce4d091729e3a67a60407d227c27241d6927be0130c98e741803" - url: "https://pub.flutter-io.cn" - source: hosted - version: "2.1.4" - vm_service: - dependency: transitive - description: - name: vm_service - sha256: b3d56ff4341b8f182b96aceb2fa20e3dcb336b9f867bc0eafc0de10f1048e957 - url: "https://pub.flutter-io.cn" - source: hosted - version: "13.0.0" - web: - dependency: transitive - description: - name: web - sha256: "97da13628db363c635202ad97068d47c5b8aa555808e7a9411963c533b449b27" - url: "https://pub.flutter-io.cn" - source: hosted - version: "0.5.1" - win32: - dependency: transitive - description: - name: win32 - sha256: "8cb58b45c47dcb42ab3651533626161d6b67a2921917d8d429791f76972b3480" - url: "https://pub.flutter-io.cn" - source: hosted - version: "5.3.0" - win32audio: - dependency: "direct main" - description: - name: win32audio - sha256: "30d663f393c41c0dc6de956f56f4b98c3942b8b1002943c75fac1a6861a6d368" - url: "https://pub.flutter-io.cn" - source: hosted - version: "1.3.1" - window_manager: - dependency: "direct main" - description: - name: window_manager - sha256: b3c895bdf936c77b83c5254bec2e6b3f066710c1f89c38b20b8acc382b525494 - url: "https://pub.flutter-io.cn" - source: hosted - version: "0.3.8" - xdg_directories: - dependency: transitive - description: - name: xdg_directories - sha256: faea9dee56b520b55a566385b84f2e8de55e7496104adada9962e0bd11bcff1d - url: "https://pub.flutter-io.cn" - source: hosted - version: "1.0.4" -sdks: - dart: ">=3.3.0 <4.0.0" - flutter: ">=3.19.0"