c723bdd53e
Deploy Client / build-windows (push) Successful in 2m2s
Deploy Client / build-android (push) Successful in 2m13s
Deploy Client / build-macos (push) Successful in 3m45s
Deploy Client / build-ios (push) Successful in 3m58s
Deploy Client / release-deploy (push) Successful in 2m1s
参照 jiu 补齐,但比 jiu 多做了 Android 原生安装(jiu 的 App 内下载仅 Win/mac): - 启动自动检查:update_provider 改 AsyncNotifier,build() 延迟 3s 首查 + 每小时 轮询;home_shell watch 拉起、listen 弹更新框;_dismissed 防反复弹(轮询重置); 强制更新走不可关闭弹窗。设置页「检查更新」改 forceCheck()。 - App 内下载(core/update/app_updater.dart,http 流式带进度框,不再 launchUrl): · Android:下 APK → open_filex 拉起系统安装器(+ REQUEST_INSTALL_PACKAGES) · Windows:下 exe → Process.start(detached) → exit(0) 覆盖安装 · macOS :下 zip → open 解压 + 访达显示,提示手动拖入(带系统扩展不自动 swap) · iOS :降级外链(TestFlight/App Store) 失败降级浏览器下载。新增 6 语更新进度/失败/提示文案。 - 依赖 open_filex;flutter analyze 仅 2 个既有 withOpacity info。 Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_013nMthbVEmQquxBRKb9Fj8u
49 lines
1.9 KiB
Dart
49 lines
1.9 KiB
Dart
// home_shell.dart — 主框架分发器(按 formFactor 选三端外壳)
|
||
//
|
||
// desktop → 侧栏 6 项 + 顶栏(对照 ui_kits/desktop)
|
||
// tablet → 暂用 MobileShell(TODO: TabletShell 侧栏双栏,对照 ui_kits/tablet)
|
||
// mobile → 底 Tab + 滑动(对照 ui_kits/mobile)
|
||
import 'package:flutter/material.dart';
|
||
import 'package:flutter_riverpod/flutter_riverpod.dart';
|
||
|
||
import '../core/responsive/form_factor.dart';
|
||
import '../pangolin_theme.dart';
|
||
import '../state/app_providers.dart';
|
||
import '../state/update_provider.dart';
|
||
import '../widgets/update_dialog.dart';
|
||
import 'desktop_shell.dart';
|
||
import 'mobile_shell.dart';
|
||
import 'tablet_shell.dart';
|
||
|
||
class HomeShell extends ConsumerWidget {
|
||
const HomeShell({super.key});
|
||
|
||
@override
|
||
Widget build(BuildContext context, WidgetRef ref) {
|
||
final c = context.pangolin;
|
||
|
||
// 启动自动检查更新:watch 惰性拉起 updateProvider(延迟 3s→查→1h 轮询);
|
||
// 有新版且本次会话未忽略时弹更新对话框。非强制更新弹前即标 dismiss,避免
|
||
// rebuild 重复弹(下轮轮询会重置);强制更新走不可关闭弹窗。
|
||
ref.listen<AsyncValue<AppUpdateInfo?>>(updateProvider, (prev, next) {
|
||
final info = next.valueOrNull;
|
||
if (info == null || !info.hasUpdate) return;
|
||
final notifier = ref.read(updateProvider.notifier);
|
||
if (notifier.isDismissed) return;
|
||
if (!info.forceUpdate) notifier.dismiss();
|
||
WidgetsBinding.instance.addPostFrameCallback((_) {
|
||
if (!context.mounted) return;
|
||
showUpdateDialog(context, ref.read(appTextProvider), info);
|
||
});
|
||
});
|
||
ref.watch(updateProvider); // 激活 provider(惰性 build)
|
||
|
||
final Widget body = switch (context.formFactor) {
|
||
FormFactor.desktop => const DesktopShell(),
|
||
FormFactor.tablet => const TabletShell(),
|
||
FormFactor.mobile => const MobileShell(),
|
||
};
|
||
return Scaffold(backgroundColor: c.bg, body: body);
|
||
}
|
||
}
|