diff --git a/client/lib/models/license.dart b/client/lib/models/license.dart index a90fc6e..20fd221 100644 --- a/client/lib/models/license.dart +++ b/client/lib/models/license.dart @@ -26,7 +26,7 @@ class LicenseInfo { maxDevices: (json['max_devices'] as num?)?.toInt() ?? AppConstants.defaultMaxDevices, expiresAt: json['expires_at'] != null - ? DateTime.tryParse(json['expires_at'] as String) + ? DateTime.tryParse(json['expires_at'] as String)?.toLocal() : null, phase: json['phase'] as String? ?? 'normal', ); @@ -139,10 +139,10 @@ class PurchaseStatusInfo { currency: json['currency'] as String? ?? 'CNY', amount: json['amount'] as String? ?? '', paidAt: json['paid_at'] != null - ? DateTime.tryParse(json['paid_at'] as String) + ? DateTime.tryParse(json['paid_at'] as String)?.toLocal() : null, expiresAt: json['expires_at'] != null - ? DateTime.tryParse(json['expires_at'] as String) + ? DateTime.tryParse(json['expires_at'] as String)?.toLocal() : null, ); } @@ -191,14 +191,15 @@ class PurchaseRecord { status: json['status'] as String? ?? 'pending', payUrl: json['pay_url'] as String? ?? '', userName: json['user_name'] as String? ?? '', + // 服务端时间为 UTC(RFC3339 Z),展示前转本地时区(同 session.dart 惯例) createdAt: json['created_at'] != null - ? DateTime.tryParse(json['created_at'] as String) + ? DateTime.tryParse(json['created_at'] as String)?.toLocal() : null, paidAt: json['paid_at'] != null - ? DateTime.tryParse(json['paid_at'] as String) + ? DateTime.tryParse(json['paid_at'] as String)?.toLocal() : null, renewedTo: json['renewed_to'] != null - ? DateTime.tryParse(json['renewed_to'] as String) + ? DateTime.tryParse(json['renewed_to'] as String)?.toLocal() : null, ); } diff --git a/client/lib/screens/license/license_orders_tab.dart b/client/lib/screens/license/license_orders_tab.dart index af056bc..e8d370f 100644 --- a/client/lib/screens/license/license_orders_tab.dart +++ b/client/lib/screens/license/license_orders_tab.dart @@ -79,6 +79,12 @@ class _LicenseOrdersTabState extends ConsumerState { void initState() { super.initState(); _status = ref.read(purchaseListProvider.notifier).currentStatus; + // 每次打开订单页主动重拉:provider 是全局单例,否则一直显示上次进入时的 + // 内存旧列表(新下的单/已删的单不同步,须手动刷新才一致)。 + // invalidate 重建保留旧值展示(copyWithPrevious),刷新期间不闪白屏。 + WidgetsBinding.instance.addPostFrameCallback((_) { + if (mounted) ref.invalidate(purchaseListProvider); + }); } @override