Jelajahi Sumber

fix: 适配桌面版本

Tony 1 bulan lalu
induk
melakukan
a89ec91e89

+ 3 - 1
lib/app/app.dart

@@ -2,6 +2,7 @@ import 'package:flutter/material.dart';
 import 'package:flutter/services.dart';
 import 'package:get/get.dart';
 import 'package:nomo/config/theme/theme_extensions/theme_extension.dart';
+import 'package:nomo/utils/misc.dart';
 import 'package:pull_to_refresh_flutter3/pull_to_refresh_flutter3.dart';
 import '../config/theme/ix_theme.dart';
 import '../config/translations/localization_service.dart';
@@ -25,7 +26,8 @@ class App extends StatelessWidget {
   @override
   Widget build(BuildContext context) {
     return ScreenUtilInit(
-      designSize: const Size(375, 812),
+      // 适配桌面版高度
+      designSize: isDesktop ? const Size(340, 640) : const Size(375, 812),
       minTextAdapt: true,
       splitScreenMode: true,
       useInheritedMediaQuery: true,

+ 2 - 1
lib/app/base/base_view.dart

@@ -43,7 +43,8 @@ abstract class BaseView<T> extends GetView<T> {
         backgroundColor: Get.reactiveTheme.scaffoldBackgroundColor,
         appBar: appBar,
         extendBody: extendBody,
-        extendBodyBehindAppBar: extendBodyBehindAppBar,
+        //extendBodyBehindAppBar: extendBodyBehindAppBar,
+        extendBodyBehindAppBar: false,
         bottomNavigationBar: bottomNavigationBar,
         floatingActionButton: floatingActionButton,
         floatingActionButtonLocation: floatingActionButtonLocation,

+ 2 - 1
lib/app/modules/home/views/home_view.dart

@@ -5,7 +5,6 @@ import 'package:flutter/material.dart' hide ConnectionState;
 import 'package:flutter_screenutil/flutter_screenutil.dart';
 import 'package:get/get.dart';
 import 'package:nomo/app/constants/iconfont/iconfont.dart';
-import 'package:nomo/app/data/sp/ix_sp.dart';
 import 'package:nomo/app/extensions/widget_extension.dart';
 import 'package:nomo/utils/misc.dart';
 import 'package:pull_to_refresh_flutter3/pull_to_refresh_flutter3.dart';
@@ -143,6 +142,8 @@ class HomeView extends BaseView<HomeController> {
                                                                   .network,
                                                           borderRadius: 14.r,
                                                         ),
+                                                      ).withClickCursor(
+                                                        isDesktop,
                                                       );
                                                     },
                                               );

+ 4 - 3
lib/app/modules/home/widgets/menu_list.dart

@@ -1,12 +1,13 @@
 import 'package:flutter/material.dart' hide Banner;
 import 'package:flutter_screenutil/flutter_screenutil.dart';
 import 'package:get/get.dart';
-import 'package:nomo/config/theme/theme_extensions/theme_extension.dart';
 
+import '../../../../utils/misc.dart';
 import '../../../data/models/banner/banner_list.dart';
-import '../../../data/sp/ix_sp.dart';
 import '../../../widgets/ix_image.dart';
 import '../controllers/home_controller.dart';
+import '../../../extensions/widget_extension.dart';
+import '../../../../config/theme/theme_extensions/theme_extension.dart';
 
 /// 菜单列表组件
 /// 支持放在 SliverFillRemaining 中
@@ -131,7 +132,7 @@ class MenuList extends StatelessWidget {
             ),
           ],
         ),
-      ),
+      ).withClickCursor(isDesktop),
     );
   }
 }

+ 40 - 29
lib/app/modules/setting/views/setting_view.dart

@@ -13,6 +13,7 @@ import 'package:nomo/app/widgets/click_opacity.dart';
 import 'package:nomo/app/widgets/ix_image.dart';
 import 'package:nomo/config/theme/theme_extensions/theme_extension.dart';
 import 'package:nomo/utils/device_manager.dart';
+import 'package:nomo/utils/misc.dart';
 
 import '../../../constants/enums.dart';
 import '../../../data/sp/ix_sp.dart';
@@ -54,7 +55,11 @@ class SettingView extends BaseView<SettingController> {
         // _buildSecuritySection(),
 
         // 底部间距
-        SliverSafeArea(sliver: SliverToBoxAdapter(child: 0.verticalSpace)),
+        SliverSafeArea(
+          sliver: SliverToBoxAdapter(
+            child: isDesktop ? 14.verticalSpace : 0.verticalSpace,
+          ),
+        ),
       ],
     );
   }
@@ -161,6 +166,7 @@ class SettingView extends BaseView<SettingController> {
                 title:
                     'UID ${DeviceManager.getCacheDeviceId().length > 12 ? '${DeviceManager.getCacheDeviceId().substring(0, 6)}***${DeviceManager.getCacheDeviceId().substring(DeviceManager.getCacheDeviceId().length - 6)}' : DeviceManager.getCacheDeviceId()}',
                 showInfo: true,
+                disableFeedback: true,
                 trailing: ClickOpacity(
                   onTap: () {
                     Clipboard.setData(
@@ -177,7 +183,6 @@ class SettingView extends BaseView<SettingController> {
                     color: Get.reactiveTheme.hintColor,
                   ),
                 ),
-                onTap: () {},
                 onInfoTap: () {
                   AllDialog.showUidInfo();
                 },
@@ -214,6 +219,7 @@ class SettingView extends BaseView<SettingController> {
                 // ),
                 // _buildDivider(),
                 _buildSettingItem(
+                  disableFeedback: true,
                   icon: IconFont.icon30,
                   iconColor: Get.reactiveTheme.shadowColor,
                   title: Strings.validTerm.tr,
@@ -515,35 +521,38 @@ class SettingView extends BaseView<SettingController> {
                 SystemHelper.openTermsOfService();
               },
             ),
-            _buildDivider(),
-            _buildSettingItem(
-              svgPath: Assets.pushNotifications,
-              iconColor: DarkThemeColors.settingAppLinearGradientStartColor,
-              iconGradient: LinearGradient(
-                colors: [
-                  DarkThemeColors.settingAppLinearGradientStartColor,
-                  DarkThemeColors.settingAppLinearGradientEndColor,
-                ],
-                begin: Alignment.topCenter,
-                end: Alignment.bottomCenter,
-              ),
-              title: Strings.pushNotifications.tr,
-              trailing: Obx(
-                () => CupertinoSwitch(
-                  value: controller.pushNotifications,
-                  onChanged: (value) {
-                    controller.showNotificationConfigPage();
-                  },
-                  activeTrackColor: Get.reactiveTheme.shadowColor,
-                  thumbColor: Colors.white,
-                  inactiveThumbColor: Colors.white,
-                  inactiveTrackColor: Colors.grey,
+            // 桌面版本不显示通知
+            if (!isDesktop) ...[
+              _buildDivider(),
+              _buildSettingItem(
+                svgPath: Assets.pushNotifications,
+                iconColor: DarkThemeColors.settingAppLinearGradientStartColor,
+                iconGradient: LinearGradient(
+                  colors: [
+                    DarkThemeColors.settingAppLinearGradientStartColor,
+                    DarkThemeColors.settingAppLinearGradientEndColor,
+                  ],
+                  begin: Alignment.topCenter,
+                  end: Alignment.bottomCenter,
+                ),
+                title: Strings.pushNotifications.tr,
+                trailing: Obx(
+                  () => CupertinoSwitch(
+                    value: controller.pushNotifications,
+                    onChanged: (value) {
+                      controller.showNotificationConfigPage();
+                    },
+                    activeTrackColor: Get.reactiveTheme.shadowColor,
+                    thumbColor: Colors.white,
+                    inactiveThumbColor: Colors.white,
+                    inactiveTrackColor: Colors.grey,
+                  ),
                 ),
+                onTap: () {
+                  controller.showNotificationConfigPage();
+                },
               ),
-              onTap: () {
-                controller.showNotificationConfigPage();
-              },
-            ),
+            ],
             _buildDivider(),
             _buildSettingItem(
               icon: IconFont.icon39,
@@ -681,6 +690,7 @@ class SettingView extends BaseView<SettingController> {
     Widget? trailing,
     VoidCallback? onTap,
     VoidCallback? onInfoTap,
+    bool disableFeedback = false,
   }) {
     // 确保至少提供了 icon 或 svgPath 之一
     assert(
@@ -690,6 +700,7 @@ class SettingView extends BaseView<SettingController> {
 
     return ClickOpacity(
       onTap: onTap,
+      disableFeedback: disableFeedback,
       child: Container(
         height: 56.w,
         padding: EdgeInsets.symmetric(horizontal: 14.w),

+ 14 - 4
lib/app/widgets/click_opacity.dart

@@ -1,4 +1,6 @@
 import 'package:flutter/material.dart';
+import 'package:nomo/app/extensions/widget_extension.dart';
+import 'package:nomo/utils/misc.dart';
 
 class ClickOpacity extends StatefulWidget {
   final Widget child;
@@ -7,6 +9,7 @@ class ClickOpacity extends StatefulWidget {
   final double opacity;
   final Duration duration;
   final bool disabled;
+  final bool disableFeedback;
 
   const ClickOpacity({
     super.key,
@@ -16,6 +19,7 @@ class ClickOpacity extends StatefulWidget {
     this.opacity = 0.5,
     this.duration = const Duration(milliseconds: 100),
     this.disabled = false,
+    this.disableFeedback = false,
   });
 
   @override
@@ -29,9 +33,15 @@ class _ClickOpacityState extends State<ClickOpacity> {
   Widget build(BuildContext context) {
     return GestureDetector(
       behavior: HitTestBehavior.opaque,
-      onTapDown: widget.disabled ? null : (_) => _setPressed(true),
-      onTapUp: widget.disabled ? null : (_) => _setPressed(false),
-      onTapCancel: widget.disabled ? null : () => _setPressed(false),
+      onTapDown: widget.disableFeedback || widget.disabled
+          ? null
+          : (_) => _setPressed(true),
+      onTapUp: widget.disableFeedback || widget.disabled
+          ? null
+          : (_) => _setPressed(false),
+      onTapCancel: widget.disableFeedback || widget.disabled
+          ? null
+          : () => _setPressed(false),
       onTap: widget.disabled ? null : widget.onTap,
       onLongPress: widget.disabled ? null : widget.onLongPress,
       child: AnimatedOpacity(
@@ -39,7 +49,7 @@ class _ClickOpacityState extends State<ClickOpacity> {
         duration: widget.duration,
         child: widget.child,
       ),
-    );
+    ).withClickCursor(!widget.disableFeedback && isDesktop);
   }
 
   void _setPressed(bool value) {

+ 3 - 2
lib/app/widgets/ix_app_bar.dart

@@ -1,6 +1,7 @@
 import 'package:flutter/material.dart';
 import 'package:flutter_screenutil/flutter_screenutil.dart';
 import 'package:get/get.dart';
+import 'package:nomo/utils/misc.dart';
 
 import '../../config/translations/localization_service.dart';
 import '../../config/theme/theme_extensions/theme_extension.dart';
@@ -43,7 +44,7 @@ class IXAppBar extends StatelessWidget implements PreferredSizeWidget {
           backgroundColor ?? Get.reactiveTheme.scaffoldBackgroundColor,
       elevation: 0,
       centerTitle: true,
-      toolbarHeight: 60,
+      toolbarHeight: isDesktop ? 40 : 60, // 配置桌面版本的AppBar高度
       scrolledUnderElevation: 0,
       leading: showBackButton
           ? ClickOpacity(
@@ -71,5 +72,5 @@ class IXAppBar extends StatelessWidget implements PreferredSizeWidget {
   }
 
   @override
-  Size get preferredSize => const Size.fromHeight(60);
+  Size get preferredSize => Size.fromHeight(isDesktop ? 40 : 60); // 配置桌面版本的AppBar高度
 }

+ 6 - 5
lib/utils/misc.dart

@@ -5,11 +5,12 @@ import 'package:path_provider/path_provider.dart';
 
 bool get isDesktop {
   if (kIsWeb) return false;
-  return [
-    TargetPlatform.windows,
-    TargetPlatform.linux,
-    TargetPlatform.macOS,
-  ].contains(defaultTargetPlatform);
+  return Platform.isLinux || Platform.isWindows || Platform.isMacOS;
+  // return const [
+  //   TargetPlatform.windows,
+  //   TargetPlatform.linux,
+  //   TargetPlatform.macOS,
+  // ].contains(defaultTargetPlatform);
 }
 
 Future<Directory> logFileDirectory() async {