fix:第一轮跑

This commit is contained in:
jingyun committed 2026-08-24 19:07:31 +08:00
1 parent e834ec7586
commit 33235f450b
56 files changed
+4357 -210

No files matched your search

@@ -1,16 +1,80 @@
import 'dart:async';
import 'package:flutter/foundation.dart';
import 'package:flutter/material.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:shadcn_ui/shadcn_ui.dart';
import '../../../common/domain/money.dart';
import '../../../common/push/notification_permission.dart';
import '../../../common/push/umeng_push_service.dart';
import '../../../common/widgets/adaptive.dart';
import '../../ads/application/startup_ad_service.dart';
import '../../ads/presentation/home_ad_banner.dart';
import '../../settings/application/update_controller.dart';
import '../../settings/application/update_service.dart';
import '../application/asset_portfolio_controller.dart';
class AssetsPage extends ConsumerWidget {
class AssetsPage extends ConsumerStatefulWidget {
const AssetsPage({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
ConsumerState<AssetsPage> createState() => _AssetsPageState();
}
class _AssetsPageState extends ConsumerState<AssetsPage> {
@override
void initState() {
super.initState();
WidgetsBinding.instance.addPostFrameCallback((_) {
unawaited(_completeColdLaunch());
});
}
Future<void> _completeColdLaunch() async {
if (!mounted) return;
await StartupAdService.showIfAvailable(context, ref);
if (!mounted) return;
await _checkColdLaunchUpgrade();
if (mounted) await _requestNotificationPermission();
}
Future<void> _requestNotificationPermission() async {
if (!mounted) return;
if (defaultTargetPlatform == TargetPlatform.iOS) {
// 研听的 U-Push register 会请求 APNs;这里再以系统 API 兜底,避免
// 旧安装已跳过欢迎页时永远不触发首次通知授权。iOS 不展示顶部说明。
await NotificationPermission.requestFromSettings();
} else {
await NotificationPermission.requestIfNeeded(context);
}
await UmengPushService.refreshDeviceToken();
}
Future<void> _checkColdLaunchUpgrade() async {
if (!mounted ||
!UpdateService.isSupported ||
!ref.read(updateSessionGateProvider).takeColdLaunchSlot()) {
return;
}
try {
final upgrade = await ref
.read(updateControllerProvider.notifier)
.checkUpgrade();
if (!mounted) return;
await UpdateService.showIfNeeded(
context,
ref,
upgrade,
source: UpgradeCheckSource.automatic,
);
} catch (_) {
// Automatic update checks must never block the assets home page.
}
}
@override
Widget build(BuildContext context) {
final summary = ref.watch(assetPortfolioControllerProvider);
final cs = ShadTheme.of(context).colorScheme;
return SafeArea(
@@ -71,6 +135,8 @@ class AssetsPage extends ConsumerWidget {
],
),
const SizedBox(height: 12),
const HomeAdBanner(),
const SizedBox(height: 12),
_Card(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,