Flutter节能模式管理插件flutter_eco_mode的使用

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

Flutter节能模式管理插件flutter_eco_mode的使用

插件介绍

pub package Test codecov

flutter_eco_mode 是一个Flutter插件,用于在移动应用中实现自定义的节能模式。根据我们的建议,该插件可以确定设备是否:

  • 是低端设备
  • 处于电池节能模式

它还将为您提供自己的规则来优化您的应用。

目前,此插件仍在开发中,仅支持Android和iOS平台。未来,该插件将提供解决方案来禁用设备的功能以节省能源,例如禁用动画或其他非必要的资源密集型操作。

为什么需要这个插件?

我们正在开发此插件,以便可能在SNCF Connect应用程序中实现,并为使用低端设备的用户提供环保的应用程序,帮助他们节省手机资源。同时,也为用户提供一个能耗更低的应用程序。

功能

特性 Android iOS 运行时 事件
平台信息 Yes Yes X
处理器数量 Yes Yes X
总内存 Yes Yes X
空闲内存 Yes Yes X
总存储 Yes Yes X
空闲存储 Yes Yes X
设备范围 Yes Yes X X
电池热状态 Yes Yes X
电池状态 Yes Yes X X
电池电量 Yes Yes X X
电池低功耗模式 Yes Yes X X
电池节能模式 Yes Yes X X

节能模式

设备范围

此功能可以计算设备的得分。得分不表示生态性能,而是用于确定设备的能力。得分通过结合不同操作系统上的静态设备信息计算得出,返回值在0到1之间。

然后,我们可以确定设备的节能范围:

  • 高端
  • 中端
  • 低端

低端设备通常是指能力或特性较差的旧设备或低成本设备。

最后,您可以使用布尔信息 isLowEndDevice 直接判断设备是否为低端设备。

如果您对设备范围不太满意?

我们允许您使用插件中的其他功能来计算自己的得分。如果您有超过三个节能范围的自定义节能模式,可以自由地为最终用户提供最佳的用户体验。

电池节能模式

此功能结合不同的电池信息来确定设备是否处于节能模式。它将返回一个布尔值。

@override
Stream<bool?> get isBatteryEcoModeStream => CombineLatestStream.list([
      _isNotEnoughBatteryStream(),
      lowPowerModeEventStream.withInitialValue(isBatteryInLowPowerMode()),
    ]).map((event) => event.any((element) => element)).asBroadcastStream();

Stream<bool> _isNotEnoughBatteryStream() => CombineLatestStream.list([
      batteryLevelEventStream.map((event) => event.isNotEnough),
      batteryStateEventStream.map((event) => event.isDischarging),
    ]).map((event) => event.every((element) => element)).asBroadcastStream();

示例

请参阅 example 目录中的完整示例应用。

示例代码

import 'package:flutter/material.dart';
import 'package:flutter_eco_mode/flutter_eco_mode.dart';
import 'package:flutter_eco_mode_example/eco_battery/eco_battery_page.dart';
import 'package:flutter_eco_mode_example/low_end_device/low_end_device_page.dart';
import 'package:flutter_eco_mode_example/wrapper_page.dart';

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

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  @override
  Widget build(BuildContext context) => MaterialApp(
        theme: ThemeData(
          appBarTheme: const AppBarTheme(
            elevation: 5,
            shadowColor: Colors.grey,
            backgroundColor: Colors.blueAccent,
            foregroundColor: Colors.white,
            titleTextStyle: TextStyle(fontSize: 25),
          ),
          textButtonTheme: TextButtonThemeData(
            style: TextButton.styleFrom(
              backgroundColor: Colors.blueAccent,
              foregroundColor: Colors.white,
              padding: const EdgeInsets.symmetric(horizontal: 20, vertical: 10),
              elevation: 5,
              shadowColor: Colors.grey,
              minimumSize: const Size(250, 50),
              textStyle: const TextStyle(fontSize: 25),
            ),
          ),
        ),
        home: Scaffold(
          appBar: AppBar(
            title: const Text('Example'),
          ),
          body: const _MyApp(),
        ),
      );
}

class _MyApp extends StatefulWidget {
  const _MyApp();

  @override
  State<_MyApp> createState() => _MyAppState();
}

class _MyAppState extends State<_MyApp> {
  late FlutterEcoMode plugin;

  @override
  void initState() {
    super.initState();
    plugin = FlutterEcoMode();
  }

  @override
  void dispose() {
    plugin.dispose();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Center(
      child: Column(
        mainAxisAlignment: MainAxisAlignment.center,
        children: [
          TextButton(
            onPressed: () => Navigator.of(context).push(
              MaterialPageRoute(
                builder: (BuildContext context) => WrapperPage(
                    LowEndDevicePage(plugin),
                    title: "Low End Device"),
              ),
            ),
            child: const Text("Low End Device"),
          ),
          const SizedBox(height: 32),
          TextButton(
            onPressed: () => Navigator.of(context).push(
              MaterialPageRoute(
                builder: (BuildContext context) => WrapperPage(
                  EcoBatteryPage(plugin),
                  title: "Eco Battery",
                ),
              ),
            ),
            child: const Text("Eco Battery"),
          ),
        ],
      ),
    );
  }
}

贡献

我们欢迎任何贡献或建议。如果您有任何问题,请联系我们。

许可证

版权所有 © 2024 SNCF Connect & Tech。
本项目采用MIT许可证,详情请参阅 LICENSE 文件。


本文撰写于2024年2月22日。


更多关于Flutter节能模式管理插件flutter_eco_mode的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter节能模式管理插件flutter_eco_mode的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


当然,下面是一个关于如何在Flutter项目中使用flutter_eco_mode插件来管理节能模式的示例代码。这个插件允许你检测设备是否处于节能模式,并在节能模式状态变化时接收通知。

首先,确保你的Flutter项目中已经添加了flutter_eco_mode插件。你可以在你的pubspec.yaml文件中添加以下依赖项:

dependencies:
  flutter:
    sdk: flutter
  flutter_eco_mode: ^x.y.z  # 请替换为最新版本号

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

接下来,在你的Flutter项目中,你可以按照以下步骤使用flutter_eco_mode插件:

  1. 导入插件

在你的Dart文件中导入flutter_eco_mode插件。

import 'package:flutter_eco_mode/flutter_eco_mode.dart';
  1. 检查节能模式状态

你可以使用EcoMode.isEcoModeActive方法来检查设备当前是否处于节能模式。

void checkEcoModeStatus() async {
  bool isEcoModeActive = await EcoMode.isEcoModeActive();
  if (isEcoModeActive) {
    print("设备当前处于节能模式");
  } else {
    print("设备当前不处于节能模式");
  }
}
  1. 监听节能模式状态变化

你可以使用EcoMode.addListener方法来监听节能模式状态的变化。

void listenToEcoModeChanges() {
  EcoMode.addListener((bool isEcoModeActive) {
    if (isEcoModeActive) {
      print("设备进入节能模式");
      // 在这里处理设备进入节能模式时的逻辑
    } else {
      print("设备退出节能模式");
      // 在这里处理设备退出节能模式时的逻辑
    }
  });
}
  1. 在适当的位置调用这些方法

你可以在你的StateStatefulWidget中调用这些方法,例如在initState中初始化监听器,在dispose中移除监听器。

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

class EcoModeScreen extends StatefulWidget {
  @override
  _EcoModeScreenState createState() => _EcoModeScreenState();
}

class _EcoModeScreenState extends State<EcoModeScreen> with WidgetsBindingObserver {
  @override
  void initState() {
    super.initState();
    WidgetsBinding.instance?.addObserver(this);
    checkEcoModeStatus();
    listenToEcoModeChanges();
  }

  @override
  void dispose() {
    EcoMode.removeAllListeners();
    WidgetsBinding.instance?.removeObserver(this);
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('节能模式管理'),
      ),
      body: Center(
        child: Text('检查控制台输出以查看节能模式状态'),
      ),
    );
  }

  void checkEcoModeStatus() async {
    bool isEcoModeActive = await EcoMode.isEcoModeActive();
    if (isEcoModeActive) {
      print("设备当前处于节能模式");
    } else {
      print("设备当前不处于节能模式");
    }
  }

  void listenToEcoModeChanges() {
    EcoMode.addListener((bool isEcoModeActive) {
      if (isEcoModeActive) {
        print("设备进入节能模式");
      } else {
        print("设备退出节能模式");
      }
    });
  }
}

在上面的代码中,我们创建了一个简单的Flutter屏幕,它会在初始化时检查节能模式的状态并监听节能模式状态的变化。你可以根据需要扩展这些功能,例如根据节能模式的状态调整应用的行为。

请注意,由于插件的具体实现和API可能会随着版本的更新而变化,因此建议查阅插件的官方文档以获取最新的使用指南和API参考。

回到顶部