// 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 轮询)。 // 非强制更新 → 顶部 banner(见下,不打断);强制更新 → 不可关闭弹窗。 ref.listen>(updateProvider, (prev, next) { final info = next.valueOrNull; if (info != null && info.hasUpdate && info.forceUpdate) { WidgetsBinding.instance.addPostFrameCallback((_) { if (context.mounted) { showUpdateDialog(context, ref.read(appTextProvider), info); } }); } }); final info = ref.watch(updateProvider).valueOrNull; final dismissedVer = ref.watch(dismissedUpdateVersionProvider); final showBanner = info != null && info.hasUpdate && !info.forceUpdate && dismissedVer != info.latestVersion; final Widget body = switch (context.formFactor) { FormFactor.desktop => const DesktopShell(), FormFactor.tablet => const TabletShell(), FormFactor.mobile => const MobileShell(), }; return Scaffold( backgroundColor: c.bg, body: showBanner ? Column(children: [UpdateBanner(info: info), Expanded(child: body)]) : body, ); } }