You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Android设备(如Samsung DeX)中检测Flutter应用是否处于桌面模式?

检测Android桌面模式(含Samsung DeX)的Flutter实现方法

要准确检测Flutter应用是否处于Samsung DeX或Android原生桌面模式,不要依赖屏幕宽度,而是直接调用Android系统提供的原生API判断系统UI模式,就能避开平板/手机屏幕尺寸的干扰。

以下是具体实现步骤:

1. 通过平台通道调用Android原生API

Flutter本身没有直接提供检测桌面模式的API,需要通过MethodChannel与Android原生层交互,利用UiModeManager类判断当前是否处于桌面模式。

Flutter端代码

import 'package:flutter/services.dart';

class DesktopModeDetector {
  static const MethodChannel _channel = MethodChannel('com.example/desktop_mode');

  static Future<bool> isInDesktopMode() async {
    try {
      final bool result = await _channel.invokeMethod('isDesktopMode');
      return result;
    } on PlatformException catch (e) {
      print('检测失败: ${e.message}');
      return false;
    }
  }
}

Android原生端代码(Kotlin)

在MainActivity.kt中注册通道并实现检测逻辑:

import android.content.Context.UI_MODE_SERVICE
import android.app.UiModeManager
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugin.common.MethodChannel

class MainActivity : FlutterActivity() {
    private val CHANNEL = "com.example/desktop_mode"

    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)
        MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { call, result ->
            if (call.method == "isDesktopMode") {
                val uiModeManager = getSystemService(UI_MODE_SERVICE) as UiModeManager
                // Android 10+ 直接用isDesktopMode(),低版本通过uiMode判断
                val isDesktop = if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q) {
                    uiModeManager.isDesktopMode
                } else {
                    uiModeManager.currentModeType == UiModeManager.MODE_TYPE_DESK
                }
                result.success(isDesktop)
            } else {
                result.notImplemented()
            }
        }
    }
}

2. 专门检测Samsung DeX(可选)

如果需要单独判断是否处于Samsung DeX环境,可在原生层结合设备制造商信息和桌面模式判断:

private fun isInSamsungDeX(): Boolean {
    val isSamsungDevice = android.os.Build.MANUFACTURER.equals("SAMSUNG", ignoreCase = true)
    val uiModeManager = getSystemService(UI_MODE_SERVICE) as UiModeManager
    val isDesktopMode = if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.Q) {
        uiModeManager.isDesktopMode
    } else {
        uiModeManager.currentModeType == UiModeManager.MODE_TYPE_DESK
    }
    return isSamsungDevice && isDesktopMode
}

之后在MethodChannel中新增isSamsungDeX方法即可。

3. 使用场景示例

在Flutter中,可在初始化或页面构建时调用检测方法,根据结果加载DeX专属优化逻辑:

@override
void initState() {
    super.initState();
    _checkDesktopMode();
}

void _checkDesktopMode() async {
    bool isDesktop = await DesktopModeDetector.isInDesktopMode();
    // bool isDeX = await DesktopModeDetector.isInSamsungDeX(); // 若使用DeX专属检测
    if (isDesktop) {
        // 执行Samsung DeX/桌面模式的优化逻辑
        // 比如调整布局、显示侧边栏等
    } else {
        // 保持手机/平板的原有行为
    }
}

这种方式完全依赖系统UI模式判断,不会因屏幕尺寸误判,确保只有在真正的桌面模式(包括DeX)下才触发优化,不影响普通手机和平板的正常运行。

内容的提问来源于stack exchange,提问作者linusser

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.02 22:45:30