diff --git a/lib/ui/configuration.dart b/lib/ui/configuration.dart index 06e7c7c..9d334c4 100644 --- a/lib/ui/configuration.dart +++ b/lib/ui/configuration.dart @@ -71,7 +71,7 @@ class AppConfiguration { Locale? _language; //是否显示更新内容公告 - bool upgradeNoticeV27 = true; + bool upgradeNoticeV28 = true; /// 是否启用画中画 ValueNotifier pipEnabled = ValueNotifier(Platform.isAndroid); @@ -202,7 +202,7 @@ class AppConfiguration { _theme = ThemeModel(mode: mode, useMaterial3: config['useMaterial3'] ?? true); _theme.color = config['themeColor'] ?? "Blue"; - upgradeNoticeV27 = config['upgradeNoticeV27'] ?? true; + upgradeNoticeV28 = config['upgradeNoticeV28'] ?? true; _language = config['language'] == null ? null : Locale.fromSubtags(languageCode: config['language'], scriptCode: config['languageScript']); @@ -252,7 +252,7 @@ class AppConfiguration { 'mode': _theme.mode.name, 'themeColor': _theme.color, 'useMaterial3': _theme.useMaterial3, - 'upgradeNoticeV27': upgradeNoticeV27, + 'upgradeNoticeV28': upgradeNoticeV28, "language": _language?.languageCode, "languageScript": _language?.scriptCode, "headerExpanded": headerExpanded, diff --git a/lib/ui/desktop/desktop.dart b/lib/ui/desktop/desktop.dart index 72a5cc8..cb0cfd4 100644 --- a/lib/ui/desktop/desktop.dart +++ b/lib/ui/desktop/desktop.dart @@ -106,7 +106,7 @@ class _DesktopHomePagePageState extends State implements EventL } }); - if (widget.appConfiguration.upgradeNoticeV27) { + if (widget.appConfiguration.upgradeNoticeV28) { WidgetsBinding.instance.addPostFrameCallback((_) { showUpgradeNotice(); }); @@ -181,7 +181,7 @@ class _DesktopHomePagePageState extends State implements EventL actions: [ TextButton( onPressed: () { - widget.appConfiguration.upgradeNoticeV27 = false; + widget.appConfiguration.upgradeNoticeV28 = false; widget.appConfiguration.flushConfig(); Navigator.pop(context); }, @@ -195,24 +195,24 @@ class _DesktopHomePagePageState extends State implements EventL isCN ? '提示:默认不会开启HTTPS抓包,请安装证书后再开启HTTPS抓包。\n' '点击HTTPS抓包(加锁图标),选择安装根证书,按照提示操作即可。\n\n' - '1. 新增html、css、js格式化以及代码高亮;\n' - '2. 高级重发支持指定时间;\n' - '3. 域名列表增加导出har文件;\n' - '4. 远程设备增加快速分享;\n' - '5. 收藏支持websocket消息持久化;\n' - '6. 远程脚本加载添加引导;\n' - '7. 优化消息体大文本展示;\n' - '8. 修复自定已读状态丢失问题;\n' + '1. 新增多选功能,支持批量删除、导出、重放;\n' + '2. 增强请求重写,支持目标请求失败时自动重写;\n' + '3. 新增最小化到托盘功能;\n' + '4. 修复 macOS 退出后端口号占用问题;\n' + '5. Windows 系统关闭系统代理时自动清理;\n' + '6. 优化 Android 应用过滤列表的图标加载与缓存;\n' + '7. 优化请求菜单,新增 Copy as fetch 等剪贴板相关操作;\n' + '8. 服务上报新增分离式 report server 模式;\n' : 'Note: HTTPS capture is disabled by default — please install the certificate before enabling HTTPS capture.\n' 'Click the HTTPS capture (lock) icon, choose "Install Root Certificate", and follow the prompts to complete installation.\n\n' - '1. Added HTML, CSS, and JS formatting with code highlighting;\n' - '2. Advanced repeat now supports specifying the time;\n' - '3. Added HAR file export for domain list;\n' - '4. Added quick share for remote devices;\n' - '5. Favorites support WebSocket message persistence;\n' - '6. Added guidance for remote script loading;\n' - '7. Optimized large text display in message body;\n' - '8. Fixed issue where custom read status was lost;\n', + '1. Added multi-select support for batch delete, export, and replay;\n' + '2. Improved request rewrite, supporting automatic rewrite when the target request fails;\n' + '3. Added minimize to tray support;\n' + '4. Fixed the port occupation issue after macOS exit;\n' + '5. Added automatic system proxy cleanup when disabling system proxy on Windows;\n' + '6. Optimized app icon loading and caching in Android app filter list;\n' + '7. Optimized the request menu with clipboard actions such as Copy as fetch;\n' + '8. Added a separated report server mode for reporting service;\n', style: const TextStyle(fontSize: 14)))); }); } diff --git a/lib/ui/mobile/mobile.dart b/lib/ui/mobile/mobile.dart index ed8d589..aad9e80 100644 --- a/lib/ui/mobile/mobile.dart +++ b/lib/ui/mobile/mobile.dart @@ -128,7 +128,7 @@ class MobileHomeState extends State implements EventListener, Li proxyServer.start(); _remoteHistorySubscription = HistoryStorage.onRemoteImported.listen((item) => _openHistoryPage(item)); - if (widget.appConfiguration.upgradeNoticeV27) { + if (widget.appConfiguration.upgradeNoticeV28) { WidgetsBinding.instance.addPostFrameCallback((_) { showUpgradeNotice(); }); @@ -336,26 +336,27 @@ class MobileHomeState extends State implements EventListener, Li String content = isCN ? '提示:默认不会开启HTTPS抓包,请安装证书后再开启HTTPS抓包。\n\n' - '1. 新增html、css、js格式化以及代码高亮;\n' - '2. 高级重发支持指定时间;\n' - '3. 域名列表增加导出har文件;\n' - '4. 远程设备增加快速分享;\n' - '5. 收藏支持websocket消息持久化;\n' - '6. 远程脚本加载添加引导;\n' - '7. 优化消息体大文本展示;\n' - '8. 修复自定已读状态丢失问题;\n' + '1. 新增多选功能,支持批量删除、导出、重放;\n' + '2. 增强请求重写,支持目标请求失败时自动重写;\n' + '3. 新增最小化到托盘功能;\n' + '4. 修复 macOS 退出后端口号占用问题;\n' + '5. Windows 系统关闭系统代理时自动清理;\n' + '6. 优化 Android 应用过滤列表的图标加载与缓存;\n' + '7. 优化请求菜单,新增 Copy as fetch 等剪贴板相关操作;\n' + '8. 服务上报新增分离式 report server 模式;\n' : 'Note: HTTPS capture is disabled by default — please install the certificate before enabling HTTPS capture.\n\n' - '1. Added HTML, CSS, and JS formatting with code highlighting;\n' - '2. Advanced repeat now supports specifying the time;\n' - '3. Added HAR file export for domain list;\n' - '4. Added quick share for remote devices;\n' - '5. Favorites support WebSocket message persistence;\n' - '6. Added guidance for remote script loading;\n' - '7. Optimized large text display in message body;\n' - '8. Fixed issue where custom read status was lost;\n'; + '1. Added multi-select support for batch delete, export, and replay;\n' + '2. Improved request rewrite, supporting automatic rewrite when the target request fails;\n' + '3. Added minimize to tray support;\n' + '4. Fixed the port occupation issue after macOS exit;\n' + '5. Added automatic system proxy cleanup when disabling system proxy on Windows;\n' + '6. Optimized app icon loading and caching in Android app filter list;\n' + '7. Optimized the request menu with clipboard actions such as Copy as fetch;\n' + '8. Added a separated report server mode for reporting service;\n' + ; showAlertDialog(isCN ? '更新内容V${AppConfiguration.version}' : "What's new in V${AppConfiguration.version}", content, () { - widget.appConfiguration.upgradeNoticeV27 = false; + widget.appConfiguration.upgradeNoticeV28 = false; widget.appConfiguration.flushConfig(); }); } diff --git a/lib/ui/mobile/request/domians.dart b/lib/ui/mobile/request/domians.dart index f17e955..36da3c6 100644 --- a/lib/ui/mobile/request/domians.dart +++ b/lib/ui/mobile/request/domians.dart @@ -125,7 +125,7 @@ class DomainListState extends State with AutomaticKeepAliveClientMix } } - clean() { + void clean() { setState(() { view.clear(); domainList.clear(); @@ -135,10 +135,10 @@ class DomainListState extends State with AutomaticKeepAliveClientMix }); } - remove(List list) { + void remove(List list) { for (var request in list) { containerMap[request.hostAndPort]?.remove(request); - if (containerMap[request.hostAndPort]!.isEmpty) { + if (containerMap[request.hostAndPort]?.isEmpty ?? false) { domainList.remove(request.hostAndPort); view.remove(request.hostAndPort); } @@ -243,7 +243,10 @@ class DomainListState extends State with AutomaticKeepAliveClientMix displayDomain: false, container: ListenableList(sortDesc ? list : list?.reversed.toList()), sortDesc: sortDesc, - onRemove: widget.onRemove, + onRemove: (requests) { + widget.onRemove?.call(requests); + remove(requests); + }, proxyServer: widget.proxyServer, selectionController: MultiSelectController(), )); diff --git a/lib/ui/mobile/request/history.dart b/lib/ui/mobile/request/history.dart index 0c10204..6ad839e 100644 --- a/lib/ui/mobile/request/history.dart +++ b/lib/ui/mobile/request/history.dart @@ -467,15 +467,11 @@ class _HistoryRecordState extends State { onTap: () => export(context), child: IconText(icon: const Icon(Icons.share), text: localizations.viewExport)), PopupMenuItem( - height: 32, - child: ListTile( - dense: true, - leading: const Icon(Icons.checklist_rtl_outlined), - title: Text(localizations.selectAction), - onTap: () async { - await Navigator.maybePop(context); - multiSelectController.toggleSelectionMode(); - })), + onTap: () async { + multiSelectController.toggleSelectionMode(); + }, + child: IconText( + icon: const Icon(Icons.checklist_rtl_outlined), text: localizations.selectAction)), PopupMenuItem( onTap: () async { var requests = requestStateKey.currentState?.currentView(); diff --git a/lib/ui/mobile/request/list.dart b/lib/ui/mobile/request/list.dart index 3f9d0bc..cab85ee 100644 --- a/lib/ui/mobile/request/list.dart +++ b/lib/ui/mobile/request/list.dart @@ -176,9 +176,10 @@ class RequestListState extends State { if (await Platforms.isIpad() && context.mounted) { box = context.findRenderObject() as RenderBox?; } - Share.shareXFiles([file], + SharePlus.instance.share(ShareParams( + files: [file], fileNameOverrides: [fileName], - sharePositionOrigin: box == null ? null : box.localToGlobal(Offset.zero) & box.size); + sharePositionOrigin: box == null ? null : box.localToGlobal(Offset.zero) & box.size)); } void sort(bool sortDesc) { diff --git a/pubspec.yaml b/pubspec.yaml index 198f724..9555cae 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -2,7 +2,7 @@ name: proxypin description: ProxyPin publish_to: 'none' # Remove this line if you wish to publish to pub.dev -version: 1.2.8+30 +version: 1.2.8+31 environment: sdk: '>=3.0.2 <4.0.0'