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

Flutter中如何保持应用唤醒及阻止屏幕锁定?

在Flutter中保持应用唤醒/阻止屏幕锁定的实现方案

嘿,这两个问题其实是关联的,我来给你捋清楚怎么实现~先说重点:Flutter官方SDK本身并没有直接暴露控制屏幕唤醒的原生API,但社区有成熟的第三方工具,或者你也可以自己写原生通道实现,完全能满足你要的「开启/关闭」式调用需求,比如类似keepAwake(true)的简单用法。

一、最省心的方案:用wakelock第三方包

这个包是跨平台的(iOS/Android都支持),用法和你想象的几乎一模一样,上手超快。

1. 先加依赖

打开你的pubspec.yaml,在dependencies下面加上:

dependencies:
  wakelock: ^0.6.2 # 记得去pub.dev查下最新版本号哦

然后执行flutter pub get把包拉下来。

2. 核心用法(完全符合你的预期)

  • 开启保持唤醒:直接调用Wakelock.enable(),就等价于你说的keepAwake(true);
  • 关闭唤醒保持:调用Wakelock.disable(),对应keepAwake(false);
  • 查当前状态:用Wakelock.isEnabled可以拿到当前是否处于唤醒锁定状态

给你整个示例代码,复制就能用:

import 'package:wakelock/wakelock.dart';

// 开启屏幕唤醒,不让屏幕自动锁屏
void turnOnWakeLock() async {
  await Wakelock.enable();
  print('屏幕唤醒已开启,不会自动锁屏啦');
}

// 关闭屏幕唤醒,恢复自动锁屏
void turnOffWakeLock() async {
  await Wakelock.disable();
  print('屏幕唤醒已关闭,会正常自动锁屏');
}

// 看看当前是不是处于唤醒锁定状态
void checkWakeLockStatus() async {
  bool isLocked = await Wakelock.isEnabled;
  print('当前唤醒状态:${isLocked ? "开启" : "关闭"}');
}

3. 平台小配置(别忘啦)

  • Android:啥都不用额外弄,包已经帮你处理好权限了
  • iOS:如果只是前台用,不需要额外配置;如果需要后台也保持唤醒(比如音频类APP),就在Info.plist里加这段:
<key>UIBackgroundModes</key>
<array>
  <string>audio</string>
</array>

二、不想用第三方包?自己写原生通道实现

要是你不想依赖第三方库,也可以通过Flutter的MethodChannel调用原生代码,逻辑也不复杂。

Android端代码

在MainActivity.kt里加这些逻辑:

import android.os.PowerManager
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.yourapp.wakelock" // 改成你自己的通道名
    private lateinit var wakeLock: PowerManager.WakeLock

    override fun configureFlutterEngine(flutterEngine: FlutterEngine) {
        super.configureFlutterEngine(flutterEngine)
        MethodChannel(flutterEngine.dartExecutor.binaryMessenger, CHANNEL).setMethodCallHandler { call, result ->
            val powerManager = getSystemService(POWER_SERVICE) as PowerManager
            wakeLock = powerManager.newWakeLock(PowerManager.SCREEN_BRIGHT_WAKE_LOCK, "YourApp::WakeLockTag")
            when (call.method) {
                "enable" -> {
                    wakeLock.acquire()
                    result.success(true)
                }
                "disable" -> {
                    if (wakeLock.isHeld) wakeLock.release()
                    result.success(true)
                }
                "isEnabled" -> {
                    result.success(wakeLock.isHeld)
                }
                else -> result.notImplemented()
            }
        }
    }

    override fun onDestroy() {
        super.onDestroy()
        if (wakeLock.isHeld) wakeLock.release() // 退出时记得释放锁
    }
}

还要在AndroidManifest.xml里加权限:

<uses-permission android:name="android.permission.WAKE_LOCK" />

iOS端代码

在AppDelegate.swift里实现:

import UIKit
import Flutter

@UIApplicationMain
@objc class AppDelegate: FlutterAppDelegate {
    private let CHANNEL = "com.yourapp.wakelock" // 和Android端通道名保持一致
    
    override func application(
        _ application: UIApplication,
        didFinishLaunchingWithOptions launchOptions: [UIApplication.LaunchOptionsKey: Any]?
    ) -> Bool {
        let controller = window?.rootViewController as! FlutterViewController
        let channel = FlutterMethodChannel(name: CHANNEL, binaryMessenger: controller.binaryMessenger)
        channel.setMethodCallHandler { [weak self] call, result in
            guard let self = self else { return }
            switch call.method {
            case "enable":
                UIApplication.shared.isIdleTimerDisabled = true
                result.success(true)
            case "disable":
                UIApplication.shared.isIdleTimerDisabled = false
                result.success(true)
            case "isEnabled":
                result.success(UIApplication.shared.isIdleTimerDisabled)
            default:
                result.notImplemented()
            }
        }
        GeneratedPluginRegistrant.register(with: self)
        return super.application(application, didFinishLaunchingWithOptions: launchOptions)
    }
}

Flutter端调用

写个工具类封装一下:

import 'package:flutter/services.dart';

class CustomWakeLock {
  static const MethodChannel _channel = MethodChannel('com.yourapp.wakelock'); // 和原生端通道名一致

  static Future<void> enable() async {
    await _channel.invokeMethod('enable');
  }

  static Future<void> disable() async {
    await _channel.invokeMethod('disable');
  }

  static Future<bool> isEnabled() async {
    return await _channel.invokeMethod('isEnabled');
  }
}

// 调用方式和第三方包一样简单
CustomWakeLock.enable();
CustomWakeLock.disable();
bool status = await CustomWakeLock.isEnabled();

总结一下

  • 优先推荐用wakelock包,省事儿,跨平台支持好,用法完全符合你想要的「开关式调用」
  • 要是有特殊需求不想用第三方,自己写原生通道也不难,就是多了点原生代码的工作量

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.22 08:21:15