Flutter屏幕保持唤醒插件wakelock_plus的使用

发布于 1周前 作者 sinazl 来自 Flutter

Flutter屏幕保持唤醒插件wakelock_plus的使用

插件简介

wakelock_pluswakelock 插件的延续,由 creativecreatorormaybenot 编写,允许您保持设备屏幕常亮,即防止屏幕自动进入休眠状态。它支持多个平台,包括Android、iOS、Web、macOS、Windows和Linux,并且不需要任何特殊权限。

支持的平台

平台 wakelock_plus 支持
Android
iOS
Web
macOS
Windows
Linux

使用方法

安装

要使用此插件,请遵循 安装指南

实现

所有功能都通过 WakelockPlus 类控制。要启用或禁用屏幕唤醒锁,可以调用以下方法:

import 'package:wakelock_plus/wakelock_plus.dart';

// 启用唤醒锁
WakelockPlus.enable();

// 禁用唤醒锁
WakelockPlus.disable();

对于更高级的用法,可以传递一个 bool 值给 WakelockPlus.toggle 方法来启用或禁用唤醒锁,也可以使用 WakelockPlus.isEnabled 获取当前的唤醒锁状态:

import 'package:wakelock_plus/wakelock_plus.dart';

// 根据布尔值切换唤醒锁
bool enable = true;
WakelockPlus.toggle(enable: enable);

enable = false;
WakelockPlus.toggle(enable: enable);

// 异步获取当前唤醒锁状态
bool wakelockEnabled = await WakelockPlus.enabled;

如果您希望等待唤醒锁切换完成(这需要极短的时间),也可以 await WakelockPlus.enableWakelockPlus.disableWakelockPlus.toggle

确保 WidgetsBinding 已初始化

如果要在 runApp() 之前调用 WakelockPlus.enable() 或其他函数(例如在 main() 中),必须确保 WidgetsBinding 已初始化:

void main() {
  WidgetsFlutterBinding.ensureInitialized();
  WakelockPlus.enable();

  runApp(MyApp());
}

通常建议根据应用程序中的某些组件是否可见来决定是否启用唤醒锁,而不是在整个应用中一直启用它。

main() 中调用 WakelockPlus.enable()

不建议在 main() 函数中调用 WakelockPlus.enable(),原因如下:

  1. 用户期望屏幕仅在特定情况下(如播放视频)保持常亮。
  2. 操作系统或其他外部来源可能会随时释放唤醒锁。

因此,最好在应用程序内部组件需要时启用唤醒锁,例如在小部件的 build 方法中。

平台特定集成说明

Android

当在Android上构建应用程序并使用此库时,可能会遇到以下提示:

One or more plugins require a higher Android NDK version.

如果出现这种情况,请在 app 模块的 build.gradle 文件的 android 闭包中添加指定的NDK版本。例如:

android {
    // 当前版本为示例版本,请使用错误消息中指定的版本
    ndkVersion "25.1.8937393" 
    //....
}

示例代码

以下是一个完整的示例代码,演示了如何使用 wakelock_plus 插件:

import 'package:flutter/material.dart';
import 'package:wakelock_plus/wakelock_plus.dart';

void main() {
  runApp(const WakelockPlusExampleApp());
}

/// 示例应用程序小部件,演示如何使用唤醒锁插件。
///
/// 实现位于 [OutlinedButton.onPressed] 回调函数和 [FutureBuilder] 中。
class WakelockPlusExampleApp extends StatefulWidget {
  const WakelockPlusExampleApp({super.key});

  @override
  State<WakelockPlusExampleApp> createState() => _WakelockPlusExampleAppState();
}

class _WakelockPlusExampleAppState extends State<WakelockPlusExampleApp> {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        appBar: AppBar(
          title: const Text('唤醒锁示例应用程序'),
        ),
        body: Center(
          child: Column(
            mainAxisAlignment: MainAxisAlignment.spaceEvenly,
            children: <Widget>[
              const Spacer(flex: 3),
              OutlinedButton(
                onPressed: () {
                  // 启用唤醒锁
                  setState(() {
                    WakelockPlus.enable();
                  });
                },
                child: const Text('启用唤醒锁'),
              ),
              const Spacer(),
              OutlinedButton(
                onPressed: () {
                  // 禁用唤醒锁
                  setState(() {
                    WakelockPlus.disable();
                  });
                },
                child: const Text('禁用唤醒锁'),
              ),
              const Spacer(flex: 2),
              FutureBuilder(
                future: WakelockPlus.enabled,
                builder: (context, AsyncSnapshot<bool> snapshot) {
                  final data = snapshot.data;
                  if (data == null) {
                    return Container();
                  }

                  return Text('当前唤醒锁状态:${data ? '已启用' : '已禁用'}');
                },
              ),
              const Spacer(flex: 3),
            ],
          ),
        ),
      ),
    );
  }
}

这个示例展示了如何使用 wakelock_plus 插件来启用和禁用唤醒锁,并实时显示当前的唤醒锁状态。


更多关于Flutter屏幕保持唤醒插件wakelock_plus的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter屏幕保持唤醒插件wakelock_plus的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,以下是如何在Flutter项目中使用wakelock_plus插件来保持屏幕唤醒状态的代码示例。这个插件提供了在Flutter应用中控制设备屏幕唤醒和解锁的功能。

1. 添加依赖

首先,你需要在pubspec.yaml文件中添加wakelock_plus依赖:

dependencies:
  flutter:
    sdk: flutter
  wakelock_plus: ^0.6.0  # 请检查最新版本号

然后运行flutter pub get来安装依赖。

2. 导入并使用插件

接下来,在你的Dart文件中导入wakelock_plus并初始化它。下面是一个简单的示例,展示了如何在应用启动时激活屏幕唤醒,并在应用停止时释放它。

import 'package:flutter/material.dart';
import 'package:wakelock_plus/wakelock_plus.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Wakelock Plus Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

class MyHomePage extends StatefulWidget {
  @override
  _MyHomePageState createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> with WidgetsBindingObserver {
  late WakelockPlus _wakelockPlus;

  @override
  void initState() {
    super.initState();
    WidgetsBinding.instance?.addObserver(this);
    _initWakelockPlus();
  }

  @override
  void dispose() {
    WidgetsBinding.instance?.removeObserver(this);
    _wakelockPlus.release().whenComplete(() {
      _wakelockPlus.dispose();
    });
    super.dispose();
  }

  Future<void> _initWakelockPlus() async {
    _wakelockPlus = WakelockPlus.instance;
    
    // 请求并保持屏幕唤醒
    bool hasPermission = await _wakelockPlus.hasSystemPermissions();
    if (hasPermission) {
      await _wakelockPlus.enable();
    } else {
      // 处理权限不足的情况,例如请求权限或者提示用户
      print("Wakelock permissions are not granted.");
    }
  }

  @override
  void didChangeAppLifecycleState(AppLifecycleState state) {
    if (state == AppLifecycleState.detached || state == AppLifecycleState.paused) {
      // 当应用进入暂停或分离状态时,释放Wakelock
      _wakelockPlus.release().catchError(print);
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Flutter Wakelock Plus Demo'),
      ),
      body: Center(
        child: Text('Screen should stay awake'),
      ),
    );
  }
}

代码说明

  1. 依赖导入和初始化:在pubspec.yaml中添加wakelock_plus依赖,并在Dart文件中导入它。
  2. 初始化Wakelock:在initState方法中初始化WakelockPlus实例,并请求保持屏幕唤醒。
  3. 处理权限:检查是否已有必要的系统权限,如果没有,可以提示用户授予权限。
  4. 释放Wakelock:在dispose方法和应用生命周期变化时(如进入暂停状态),释放Wakelock。

注意事项

  • 在Android上,你需要在AndroidManifest.xml中添加WAKE_LOCK权限:
    <uses-permission android:name="android.permission.WAKE_LOCK" />
    
  • 在iOS上,不需要额外的配置,但请确保你的应用有适当的理由保持屏幕唤醒,以避免影响用户体验和电池寿命。

这个示例展示了如何使用wakelock_plus插件来保持屏幕唤醒状态。根据你的应用需求,你可以进一步定制和扩展这个功能。

回到顶部