fix: 更新诸多bug

This commit is contained in:
speakeloudest 2026-01-08 03:49:59 -08:00
parent 8477c2e343
commit eb4fad64cb
11 changed files with 133 additions and 79 deletions

View File

@ -387,6 +387,11 @@ class BoxService(
stopService() stopService()
} }
fun onTaskRemoved(intent: Intent?) {
Log.d(TAG, "📦 onTaskRemoved 被调用, 准备停止 VPN 服务")
stopService()
}
fun writeLog(message: String) { fun writeLog(message: String) {
binder.broadcast { binder.broadcast {
it.onServiceWriteLog(message) it.onServiceWriteLog(message)

View File

@ -38,6 +38,11 @@ class VPNService : VpnService(), PlatformInterfaceWrapper {
service.onDestroy() service.onDestroy()
} }
override fun onTaskRemoved(rootIntent: Intent?) {
super.onTaskRemoved(rootIntent)
service.onTaskRemoved(rootIntent)
}
override fun onRevoke() { override fun onRevoke() {
runBlocking { runBlocking {
withContext(Dispatchers.Main) { withContext(Dispatchers.Main) {

View File

@ -1,5 +1,6 @@
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:easy_refresh/easy_refresh.dart'; import 'package:easy_refresh/easy_refresh.dart';
import 'package:flutter/widgets.dart';
import '../../../services/api_service/kr_api.user.dart'; import '../../../services/api_service/kr_api.user.dart';
import '../../../utils/kr_common_util.dart'; import '../../../utils/kr_common_util.dart';
@ -85,6 +86,7 @@ class HIHelpController extends GetxController {
int kr_page = 1; int kr_page = 1;
final int kr_size = 10; final int kr_size = 10;
final EasyRefreshController refreshController = EasyRefreshController(); final EasyRefreshController refreshController = EasyRefreshController();
final ScrollController kr_scrollController = ScrollController();
@override @override
void onInit() { void onInit() {
@ -134,6 +136,7 @@ class HIHelpController extends GetxController {
@override @override
void onClose() { void onClose() {
refreshController.dispose(); refreshController.dispose();
kr_scrollController.dispose();
super.onClose(); super.onClose();
} }
} }

View File

@ -25,11 +25,10 @@ class HIHelpView extends GetView<HIHelpController> implements HasSwipeConfig {
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final ScrollController scrollController = ScrollController();
return HIBaseScaffold( return HIBaseScaffold(
child: Padding( child: Padding(
padding: const EdgeInsets.only(left: 20), padding: const EdgeInsets.only(left: 0),
child: Column( child: Column(
children: [ children: [
Expanded( Expanded(
@ -51,9 +50,9 @@ class HIHelpView extends GetView<HIHelpController> implements HasSwipeConfig {
child: Padding( child: Padding(
padding: EdgeInsets.only(right: 0.w), // padding: EdgeInsets.only(right: 0.w), //
child: HiFixedScrollbar( child: HiFixedScrollbar(
controller: scrollController, controller: controller.kr_scrollController,
child: ListView.builder( child: ListView.builder(
controller: scrollController, controller: controller.kr_scrollController,
padding: EdgeInsets.only(left: 40.w, right: 40.w), padding: EdgeInsets.only(left: 40.w, right: 40.w),
itemCount: controller.kr_messages.length, itemCount: controller.kr_messages.length,
itemBuilder: (context, index) { itemBuilder: (context, index) {

View File

@ -200,7 +200,9 @@ class KRHomeController extends GetxController with WidgetsBindingObserver {
// //
if (kr_isConnected.value) { if (kr_isConnected.value) {
KRLogUtil.kr_i('当前已连接,跳过自动连接', tag: 'QuickConnect'); KRLogUtil.kr_i('当前已连接,同步线路信息', tag: 'QuickConnect');
await _restoreSelectedNode();
kr_updateConnectionInfo();
return; return;
} }
@ -1609,7 +1611,8 @@ class KRHomeController extends GetxController with WidgetsBindingObserver {
String actualTag; String actualTag;
if (kr_selectedCountryTag.value == 'auto') { if (kr_selectedCountryTag.value == 'auto' &&
kr_cutSeletedTag.value.isNotEmpty) {
actualTag = kr_cutSeletedTag.value; actualTag = kr_cutSeletedTag.value;
} }
// 🔧 // 🔧

View File

@ -21,6 +21,7 @@ class KRMessageController extends GetxController {
controlFinishRefresh: true, // true controlFinishRefresh: true, // true
controlFinishLoad: true, // controlFinishLoad: true, //
); );
final ScrollController kr_scrollController = ScrollController();
@override @override
void onInit() { void onInit() {
@ -86,6 +87,7 @@ class KRMessageController extends GetxController {
@override @override
void onClose() { void onClose() {
refreshController.dispose(); refreshController.dispose();
kr_scrollController.dispose();
super.onClose(); super.onClose();
} }
} }

View File

@ -26,11 +26,10 @@ class KRMessageView extends GetView<KRMessageController>
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final ScrollController scrollController = ScrollController();
return HIBaseScaffold( return HIBaseScaffold(
child: Padding( child: Padding(
padding: const EdgeInsets.only(left: 20), padding: const EdgeInsets.only(left: 0),
child: Stack( child: Stack(
children: [ children: [
// //
@ -80,9 +79,9 @@ class KRMessageView extends GetView<KRMessageController>
child: Padding( child: Padding(
padding: EdgeInsets.only(right: 0.w), padding: EdgeInsets.only(right: 0.w),
child: HiFixedScrollbar( child: HiFixedScrollbar(
controller: scrollController, controller: controller.kr_scrollController,
child: ListView.builder( child: ListView.builder(
controller: scrollController, controller: controller.kr_scrollController,
padding: padding:
EdgeInsets.only(left: 40.w, right: 40.w), EdgeInsets.only(left: 40.w, right: 40.w),
itemCount: controller.kr_messages.length, itemCount: controller.kr_messages.length,

View File

@ -11,10 +11,10 @@ import '../../../utils/kr_common_util.dart';
import '../../../localization/app_translations.dart'; import '../../../localization/app_translations.dart';
import '../../../utils/kr_log_util.dart'; import '../../../utils/kr_log_util.dart';
import 'package:flutter/foundation.dart'; import 'package:flutter/foundation.dart';
import ''; import 'package:flutter/widgets.dart';
/// Tauri /// Tauri
class KROrderStatusController extends GetxController { class KROrderStatusController extends GetxController with WidgetsBindingObserver {
/// API服务 /// API服务
final KRSubscribeApi kr_subscribeApi = KRSubscribeApi(); final KRSubscribeApi kr_subscribeApi = KRSubscribeApi();
final KRSubscribeService kr_subscribeService = KRSubscribeService(); final KRSubscribeService kr_subscribeService = KRSubscribeService();
@ -99,6 +99,9 @@ class KROrderStatusController extends GetxController {
kr_checkPaymentStatus(); kr_checkPaymentStatus();
// //
kr_startCheckingPaymentStatus(); kr_startCheckingPaymentStatus();
//
WidgetsBinding.instance.addObserver(this);
} }
@override @override
@ -114,9 +117,25 @@ class KROrderStatusController extends GetxController {
} }
kr_timer?.cancel(); kr_timer?.cancel();
kr_countdownTimer?.cancel(); kr_countdownTimer?.cancel();
//
WidgetsBinding.instance.removeObserver(this);
super.onClose(); super.onClose();
} }
@override
void didChangeAppLifecycleState(AppLifecycleState state) {
super.didChangeAppLifecycleState(state);
if (state == AppLifecycleState.resumed) {
if (kDebugMode) {
print('📱 App 恢复前台,立即更新倒计时和订单状态');
}
//
kr_updateCountdown();
//
kr_checkPaymentStatus();
}
}
/// Tauri 5 /// Tauri 5
void kr_startCheckingPaymentStatus() { void kr_startCheckingPaymentStatus() {
if (kDebugMode) { if (kDebugMode) {

View File

@ -103,6 +103,22 @@ class _HICollapsibleItemWidgetState extends State<HICollapsibleItemWidget> {
setState(() { setState(() {
_isExpanded = !_isExpanded; _isExpanded = !_isExpanded;
}); });
if (_isExpanded) {
//
WidgetsBinding.instance.addPostFrameCallback((_) {
Future.delayed(const Duration(milliseconds: 200), () {
if (mounted && _isExpanded) {
Scrollable.ensureVisible(
context,
duration: const Duration(milliseconds: 300),
curve: Curves.easeInOut,
alignment: 0.1, //
);
}
});
});
}
}, },
behavior: HitTestBehavior.translucent, behavior: HitTestBehavior.translucent,
child: Padding( child: Padding(

View File

@ -79,13 +79,19 @@ class _HiFixedScrollbarState extends State<HiFixedScrollbar>
bool _onScrollNotification(ScrollNotification notification) { bool _onScrollNotification(ScrollNotification notification) {
if (!mounted) return false; if (!mounted) return false;
if (_fadeTimer != null && _fadeTimer!.isActive) { if (_fadeTimer != null && _fadeTimer!.isActive) {
_fadeTimer?.cancel(); _fadeTimer?.cancel();
} }
if (notification is ScrollStartNotification || if (notification is ScrollStartNotification ||
notification is ScrollUpdateNotification) { notification is ScrollUpdateNotification) {
_fadeController.forward(); _fadeController.forward();
_updateThumbPosition(); _updateThumbPosition();
} else if (notification is ScrollMetricsNotification) {
//
//
_updateThumbPosition();
} else if (notification is ScrollEndNotification || } else if (notification is ScrollEndNotification ||
(notification is UserScrollNotification && (notification is UserScrollNotification &&
notification.direction == ScrollDirection.idle)) { notification.direction == ScrollDirection.idle)) {
@ -119,14 +125,18 @@ class _HiFixedScrollbarState extends State<HiFixedScrollbar>
return; return;
} }
// = -
final trackHeight = viewport - widget.thumbHeight.h; final trackHeight = viewport - widget.thumbHeight.h;
final scrollRatio = offset / maxScrollExtent; //
final newOffset = (trackHeight * scrollRatio).clamp(0.0, trackHeight); final scrollRatio = (offset / maxScrollExtent).clamp(0.0, 1.0);
final newOffset = trackHeight * scrollRatio;
if (_thumbOffset != newOffset) { if (_thumbOffset != newOffset) {
setState(() { setState(() {
_thumbOffset = newOffset; _thumbOffset = newOffset;
}); });
//
if (_fadeTimer != null && _fadeTimer!.isActive) { if (_fadeTimer != null && _fadeTimer!.isActive) {
_fadeTimer?.cancel(); _fadeTimer?.cancel();
} }
@ -134,8 +144,6 @@ class _HiFixedScrollbarState extends State<HiFixedScrollbar>
_fadeTimer = Timer(widget.fadeDelay, () { _fadeTimer = Timer(widget.fadeDelay, () {
if (mounted) { if (mounted) {
_fadeController.reverse(); _fadeController.reverse();
} else {
_fadeTimer?.cancel();
} }
}); });
} }
@ -151,67 +159,69 @@ class _HiFixedScrollbarState extends State<HiFixedScrollbar>
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
return LayoutBuilder( return NotificationListener<ScrollNotification>(
builder: (_, constraints) { onNotification: _onScrollNotification,
final position = child: Stack(
widget.controller.hasClients ? widget.controller.position : null; children: [
widget.child,
// widget.child
AnimatedBuilder(
animation: _fadeController,
builder: (context, child) {
final position = widget.controller.hasClients
? widget.controller.position
: null;
if (position == null || !position.hasContentDimensions) { if (position == null || !position.hasContentDimensions) {
return widget.child; return const SizedBox.shrink();
} }
final maxScrollExtent = position.maxScrollExtent; final maxScrollExtent = position.maxScrollExtent;
final canShowScrollbar = widget.isShowScrollbar && maxScrollExtent > 0; final canShowScrollbar =
widget.isShowScrollbar && maxScrollExtent > 0;
return Stack( if (!canShowScrollbar) {
children: [ return const SizedBox.shrink();
NotificationListener<ScrollNotification>( }
onNotification: _onScrollNotification,
child: widget.child, return Opacity(
), opacity: _fadeController.value,
if (canShowScrollbar) child: Stack(
AnimatedBuilder( children: [
animation: _fadeController, // (Track)
builder: (context, child) { Positioned(
return Opacity( right: widget.right.w.toDouble(),
opacity: _fadeController.value, top: 0,
child: Stack( bottom: 0,
children: [ child: Container(
// (Track) width: widget.thickness.w.toDouble(),
Positioned( decoration: BoxDecoration(
right: widget.right.w.toDouble(), color: widget.trackColor,
top: 0, borderRadius: BorderRadius.circular(4),
bottom: 0,
child: Container(
width: widget.thickness.w.toDouble(),
decoration: BoxDecoration(
color: widget.trackColor,
borderRadius: BorderRadius.circular(4),
),
),
), ),
),
// (Thumb)
Positioned(
right: widget.right.w.toDouble(),
top: _thumbOffset,
child: Container(
width: widget.thickness.w.toDouble(),
height: widget.thumbHeight.h.toDouble(),
decoration: BoxDecoration(
color: widget.thumbColor,
borderRadius: BorderRadius.circular(4),
),
),
),
],
), ),
);
}, // (Thumb)
), Positioned(
], right: widget.right.w.toDouble(),
); top: _thumbOffset,
}, child: Container(
width: widget.thickness.w.toDouble(),
height: widget.thumbHeight.h.toDouble(),
decoration: BoxDecoration(
color: widget.thumbColor,
borderRadius: BorderRadius.circular(4),
),
),
),
],
),
);
},
),
],
),
); );
} }
} }

View File

@ -30,9 +30,6 @@ PODS:
- FlutterMacOS - FlutterMacOS
- url_launcher_macos (0.0.1): - url_launcher_macos (0.0.1):
- FlutterMacOS - FlutterMacOS
- webview_flutter_wkwebview (0.0.1):
- Flutter
- FlutterMacOS
- window_manager (0.2.0): - window_manager (0.2.0):
- FlutterMacOS - FlutterMacOS
@ -49,7 +46,6 @@ DEPENDENCIES:
- share_plus (from `Flutter/ephemeral/.symlinks/plugins/share_plus/macos`) - share_plus (from `Flutter/ephemeral/.symlinks/plugins/share_plus/macos`)
- tray_manager (from `Flutter/ephemeral/.symlinks/plugins/tray_manager/macos`) - tray_manager (from `Flutter/ephemeral/.symlinks/plugins/tray_manager/macos`)
- url_launcher_macos (from `Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos`) - url_launcher_macos (from `Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos`)
- webview_flutter_wkwebview (from `Flutter/ephemeral/.symlinks/plugins/webview_flutter_wkwebview/darwin`)
- window_manager (from `Flutter/ephemeral/.symlinks/plugins/window_manager/macos`) - window_manager (from `Flutter/ephemeral/.symlinks/plugins/window_manager/macos`)
SPEC REPOS: SPEC REPOS:
@ -83,8 +79,6 @@ EXTERNAL SOURCES:
:path: Flutter/ephemeral/.symlinks/plugins/tray_manager/macos :path: Flutter/ephemeral/.symlinks/plugins/tray_manager/macos
url_launcher_macos: url_launcher_macos:
:path: Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos :path: Flutter/ephemeral/.symlinks/plugins/url_launcher_macos/macos
webview_flutter_wkwebview:
:path: Flutter/ephemeral/.symlinks/plugins/webview_flutter_wkwebview/darwin
window_manager: window_manager:
:path: Flutter/ephemeral/.symlinks/plugins/window_manager/macos :path: Flutter/ephemeral/.symlinks/plugins/window_manager/macos
@ -104,7 +98,6 @@ SPEC CHECKSUMS:
share_plus: 76dd39142738f7a68dd57b05093b5e8193f220f7 share_plus: 76dd39142738f7a68dd57b05093b5e8193f220f7
tray_manager: 9064e219c56d75c476e46b9a21182087930baf90 tray_manager: 9064e219c56d75c476e46b9a21182087930baf90
url_launcher_macos: c82c93949963e55b228a30115bd219499a6fe404 url_launcher_macos: c82c93949963e55b228a30115bd219499a6fe404
webview_flutter_wkwebview: a4af96a051138e28e29f60101d094683b9f82188
window_manager: 3a1844359a6295ab1e47659b1a777e36773cd6e8 window_manager: 3a1844359a6295ab1e47659b1a777e36773cd6e8
PODFILE CHECKSUM: 04e3af9980f29522a03273385f61d561da92c2fb PODFILE CHECKSUM: 04e3af9980f29522a03273385f61d561da92c2fb