diff --git a/lib/pages/common/common_page.dart b/lib/pages/common/common_page.dart index abd90a4c39..8c0e1e56ca 100644 --- a/lib/pages/common/common_page.dart +++ b/lib/pages/common/common_page.dart @@ -48,13 +48,13 @@ abstract class CommonPageState extends State { case .forward: _showTopBar?.value = true; _showBottomBar?.value = true; - if (_mainController.useNativeTabs && Pref.hideBottomBar) { + if (_mainController.useNativeTabs.value && Pref.hideBottomBar) { HarmonyChannel.setShellBarsScrollHidden(false); } case .reverse: _showTopBar?.value = false; _showBottomBar?.value = false; - if (_mainController.useNativeTabs && Pref.hideBottomBar) { + if (_mainController.useNativeTabs.value && Pref.hideBottomBar) { HarmonyChannel.setShellBarsScrollHidden(true); } case _: @@ -82,7 +82,7 @@ abstract class CommonPageState extends State { final scrollDelta = notification.scrollDelta ?? 0; if (pixel < 0.0 && scrollDelta > 0) return false; // 同步原生 HDS 底栏滚动显隐 - if (_mainController.useNativeTabs && Pref.hideBottomBar) { + if (_mainController.useNativeTabs.value && Pref.hideBottomBar) { HarmonyChannel.setShellBarsScrollHidden( _barOffset!.value > Style.topBarHeight / 2, ); diff --git a/lib/pages/main/controller.dart b/lib/pages/main/controller.dart index 37e95e6f87..8c904c0e52 100644 --- a/lib/pages/main/controller.dart +++ b/lib/pages/main/controller.dart @@ -62,7 +62,7 @@ class MainController extends GetxController /// 鸿蒙原生 HDS 底栏(API >= 23 时由原生渲染液态玻璃页签栏) /// 修改设置后需重启应用生效 - bool useNativeTabs = false; + final RxBool useNativeTabs = false.obs; final useSideBar = Pref.useSideBar; final mainTabBarView = Pref.mainTabBarView; @@ -142,7 +142,7 @@ class MainController extends GetxController final apiVersion = await HarmonyChannel.getDeviceInfo(); final enableHdsBar = Pref.enableHdsBar; final useNative = apiVersion != null && apiVersion >= 23 && enableHdsBar; - useNativeTabs = useNative; + useNativeTabs.value = useNative; HarmonyChannel.setShellBars(useNativeTabs: useNative); } diff --git a/lib/pages/main/view.dart b/lib/pages/main/view.dart index a182569b6c..f9713fd88c 100644 --- a/lib/pages/main/view.dart +++ b/lib/pages/main/view.dart @@ -46,6 +46,8 @@ class _MainAppState extends PopScopeState final _mainController = Get.put(MainController()); late final _setting = GStorage.setting; late EdgeInsets _padding; + /// 缓存当前主题主色值,供 ever 回调读取 + int _primaryColorValue = 0; @override bool get initCanPop => false; @@ -54,6 +56,14 @@ class _MainAppState extends PopScopeState void initState() { super.initState(); addObserverMobile(this); + // 监听 useNativeTabs 异步赋值(_initHdsBar 完成时触发) + ever(_mainController.useNativeTabs, (_) { + if (_mainController.useNativeTabs.value && _primaryColorValue != 0) { + HarmonyChannel.setTabSelectedColor( + '#${_primaryColorValue.toRadixString(16).padLeft(8, '0').substring(2)}', + ); + } + }); if (PlatformUtils.isDesktop) { windowManager ..addListener(this) @@ -81,11 +91,12 @@ class _MainAppState extends PopScopeState if (!_mainController.useSideBar) { _mainController.useBottomNav = MediaQuery.sizeOf(context).isPortrait; } + // 缓存主题主色,供 ever 回调在 useNativeTabs 异步就绪后补发 + _primaryColorValue = Theme.of(context).colorScheme.primary.value; // 同步主题色到 ArkTS HdsTabs 底栏 - if (_mainController.useNativeTabs) { - final primary = Theme.of(context).colorScheme.primary; + if (_mainController.useNativeTabs.value) { HarmonyChannel.setTabSelectedColor( - '#${primary.value.toRadixString(16).padLeft(8, '0').substring(2)}', + '#${_primaryColorValue.toRadixString(16).padLeft(8, '0').substring(2)}', ); } } @@ -279,13 +290,13 @@ class _MainAppState extends PopScopeState } } - Widget? get _bottomNav { - // 非响应式读取:useNativeTabs 仅在冷启动时由 _initHdsBar 设置, - // 修改设置后需重启生效,避免 Obx 包裹 Scaffold 导致无限重建 - if (_mainController.useNativeTabs) { - return null; + Widget get _bottomNav { + // 响应式读取:useNativeTabs 由 _initHdsBar 异步赋值, + // Obx 仅包裹底栏部分,避免包裹 Scaffold 导致无限重建 + if (_mainController.useNativeTabs.value) { + return const SizedBox.shrink(); } - Widget? bottomNav = _mainController.navigationBars.length > 1 + final Widget bottomNav = _mainController.navigationBars.length > 1 ? _mainController.enableMYBar ? Obx( () => NavigationBar( @@ -322,8 +333,8 @@ class _MainAppState extends PopScopeState .toList(), ), ) - : null; - if (bottomNav != null && _mainController.hideBottomBar) { + : const SizedBox.shrink(); + if (_mainController.hideBottomBar) { if (_mainController.barOffset case final barOffset?) { return Obx( () => FractionalTranslation( @@ -462,7 +473,7 @@ class _MainAppState extends PopScopeState ), child: child, ), - bottomNavigationBar: _bottomNav, + bottomNavigationBar: Obx(() => _bottomNav), ); if (PlatformUtils.isMobile) { diff --git a/pubspec.yaml b/pubspec.yaml index 3a863f4245..b4ea5d2f7b 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -17,7 +17,7 @@ publish_to: "none" # Remove this line if you wish to publish to pub.dev # In Windows, build-name is used as the major, minor, and patch parts # of the product and file versions while build-number is used as the build suffix. # update when release -version: 2.0.2+5227 +version: 2.0.2+5229 environment: sdk: ">=3.11.1"