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
相关产品推荐
相关产品推荐

