Flutter 中的屏幕常亮:让你的应用一直亮着

1,630 阅读2分钟

我正在参加「掘金·启航计划」

嗨!这里是甜瓜看代码,在开发 Flutter 应用时,我们有时需要让屏幕保持常亮状态,比如在播放视频或音频时,或者在需要长时间保持屏幕亮度的场景下。那么,Flutter 中如何实现屏幕常亮呢?

方法一:使用系统插件

  在 Flutter 中,可以使用系统插件来控制屏幕常亮。Flutter 社区中已经有很多相关插件可供使用,比如 [wakelock]。这里我们以 wakelock 为例来演示如何使用插件来实现屏幕常亮。

首先,我们需要在 pubspec.yaml 文件中添加 wakelock 插件的依赖:

dependencies:
  wakelock: ^0.6.2

然后,在需要保持屏幕常亮的地方调用 Wakelock.enable() 方法即可:

import 'package:wakelock/wakelock.dart';

// 开启屏幕常亮
Wakelock.enable();

当不再需要屏幕常亮时,可以调用 Wakelock.disable() 方法来关闭:

// 关闭屏幕常亮
Wakelock.disable();

方法二:使用 Flutter 的 Widgets

  Flutter 中的 Widgets 也提供了控制屏幕常亮的功能。具体来说,我们可以使用 KeepAliveAutomaticKeepAliveClientMixin Widgets 来实现。

  首先,让我们看一下 KeepAlive Widget。该 Widget 可以用来控制一个 Widget 是否一直保持在内存中,从而保持该 Widget 的状态不被销毁。例如,我们可以将一个带有视频播放器的 Widget 包裹在 KeepAlive Widget 中,使其在视频播放期间保持在内存中:

class VideoPlayerWidget extends StatefulWidget {
  @override
  _VideoPlayerWidgetState createState() => _VideoPlayerWidgetState();
}

class _VideoPlayerWidgetState extends State<VideoPlayerWidget> with AutomaticKeepAliveClientMixin {
  // 在这里开启屏幕常亮
  @override
  bool get wantKeepAlive => true;

  @override
  Widget build(BuildContext context) {
    super.build(context); // 必须调用 super.build
    return VideoPlayer(/* ... */);
  }
}

  需要注意的是,在使用 KeepAlive Widget 时,必须在 State 类中实现 AutomaticKeepAliveClientMixin,并重写其中的 wantKeepAlive 属性,返回 true。另外,在 build 方法中需要调用 super.build(context) 方法二的代码示例:

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

class ScreenOnWidget extends StatefulWidget {
  const ScreenOnWidget({Key? key}) : super(key: key);

  @override
  _ScreenOnWidgetState createState() => _ScreenOnWidgetState();
}

class _ScreenOnWidgetState extends State<ScreenOnWidget> with AutomaticKeepAliveClientMixin {
  @override
  bool get wantKeepAlive => true;

  @override
  void initState() {
    super.initState();
    Wakelock.enable();
  }

  @override
  void dispose() {
    Wakelock.disable();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    super.build(context);
    return Container(
      child: Center(
        child: Text("Screen On Widget"),
      ),
    );
  }
}

  在上面的代码中,我们在 initState 中开启屏幕常亮,而在 dispose 中关闭。这样可以保证当该 Widget 被销毁时,屏幕常亮功能也会被关闭,避免浪费系统资源。

总结

  通过使用系统插件或者 Flutter Widgets,我们可以很容易地实现 Flutter 应用中的屏幕常亮功能。如果需要在多个 Widget 中使用该功能,可以将开启和关闭屏幕常亮的逻辑抽象成一个单独的 Widget,然后在需要使用的地方引用即可。在使用屏幕常亮功能时,我们需要注意避免浪费系统资源,及时关闭不需要的屏幕常亮状态。

  希望本文对你有所帮助,让你在开发 Flutter 应用时更加得心应手。这里是甜瓜看代码,期待你的关注!