Flutter设备管理或功能管理插件flutter_manager的使用

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

Flutter设备管理或功能管理插件flutter_manager的使用

需求

flutter_manager 的最新版本需要 Dart SDK 2.12.0 或更高版本。

安装

终端执行以下命令以激活插件:

$ dart pub global activate flutter_manager

了解更多关于激活和使用包的信息,请参阅这里

更新

更新操作与安装相同:

$ dart pub global activate flutter_manager

使用

基本用法如下:

manager <command> [arguments]

主要功能

mvm 命令可以统一管理 Flutter 组件库的版本号,并通过一次点击在本地路径和远程 Git 依赖之间切换。其原理是通过读取 mvm 文件夹下的配置文件来构建有向无环图(DAG),然后从每个子节点回溯到根节点的所有路径。

flutter_manager 库的最大优势包括:

  1. 低使用成本:由于是一个命令行工具,只需执行一次 manager mvm 即可添加或删除依赖库或更新库版本。
  2. 低重构成本:原有的组件化解决方案几乎无需移动,只需在 mvm 配置文件夹中配置项目结构和依赖关系,工具会自动识别和管理。
  3. 用户无需手动添加或删除依赖库或更新版本号:只需修改统一的配置文件 mvm,工具将自动定位并更新正确的模块。特别是在在 Git 和路径依赖之间切换时,无需重复繁琐的搜索过程。
  4. 各模块对第三方库的依赖相互独立:因此不需要统一的底层模块,真正实现了组件化。
  5. 通过 version.yaml 配置文件管理依赖库的版本号:在整个项目中共享,即每个子模块使用统一版本的第三方库,避免版本冲突。
  6. 通过 delegate.yaml 配置文件统一管理每个组件的本地/远程分支

当第一次执行 manager mvm 时,配置文件会自动生成模板,也可以手动创建。它包含 module.yamlversion.yamldelegate.yaml,用户将在这些文件中注册和更新项目组件信息。

各个文件的作用

  • module.yaml

列出所有业务组件(包括宿主项目)的依赖项:

yourModuleName:
  dependencies:
    - thirdPartyLibraryName
    - yourModuleName
  • version.yaml

配置所有依赖库的版本号(支持版本号、路径和 Git 三种方式):

version:
  thirdPartyLibraryName1: versionCode
  thirdPartyLibraryName2: git
  yourModuleName1: git
  yourModuleName2: path
  • delegate.yaml

配置 Git 和路径依赖的实际地址:

# 所有组件的本地根路径
path: commonLocalRootPath
git:
  yourModuleName:
    git:
      url: ""
      # 这个组件的分支
      ref: ""
  thirdPartyLibraryName:
    git:
      url: ""
      ref: ""

记住,当配置文件发生变化时,需要再次执行 manager mvm 命令才能生效。

当控制台出现 Execution succeed 日志关键字时,表示任务成功执行,实际的项目组件依赖关系将被打印出来,这可能与你在 version.yaml 中配置的依赖关系不同,因为 Flutter 要求从组件到宿主项目的所有路径的实际依赖关系必须一致。但你只需要关注 version.yaml,日志仅表示存在更好的依赖配置。

你可以运行 example 示例体验一下。

其他功能

  • 运行 Flutter 命令,例如 clean
manager clean
  • 运行内置命令,例如删除文件:
manager delete a.txt
  • 运行自定义命令
manager custom ~/currentActivity.sh
manager custom flutter pub get

最后

每个命令都有一个缩写,通常是命令的第一个字符。

你可以运行 manager help 获取更多信息。

Global options:
-h, --help    打印此使用信息。

Available commands:
  clean    运行 flutter clean
  custom   运行自定义命令或自己的脚本
  delete   运行删除文件,默认为 pubspec.lock
  format   运行 flutter format .
  mvm      Flutter 模块版本管理器
  pub      运行 flutter pub get (注意:这是一个父命令)
  pure     按顺序运行删除、清理和获取命令

运行 "manager help <command>" 获取更多关于某个命令的信息。

示例代码

example/lib/main.dart

import 'package:flutter/material.dart';

void main() => runApp(const MyApp());

class MyApp extends StatelessWidget {
  const MyApp();

  // 此小部件是您的应用程序的根部。
  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter 示例',
      theme: ThemeData(
        // 这是您的应用程序的主题。
        //
        // 尝试运行您的应用程序,您会看到应用有一个蓝色的工具栏。然后,在不退出应用程序的情况下,尝试将
        // 下面的 primarySwatch 更改为 Colors.green 并重新加载(在运行 "flutter run" 的控制台中按 "r" 键,
        // 或者在 Flutter IDE 中按 "运行 > Flutter 热重载")。请注意,计数器不会重置为零;应用程序并未重启。
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'Flutter 示例首页'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({required this.title});

  // 这个小部件是您的应用程序的主页。它是有状态的,意味着它有一个状态对象(定义在下面)
  // 该状态对象包含影响外观的字段。
  // 这个类是状态的配置。它保存了由父级(在这里是 App 小部件)提供的值(在这个例子中是标题),
  // 并且由 State 的 build 方法使用。Widget 子类中的字段总是标记为 "final"。

  final String title;

  [@override](/user/override)
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  int _counter = 0;

  void _incrementCounter() {
    setState(() {
      // 这次调用 setState 告诉 Flutter 框架某些事情已经改变,
      // 导致它重新运行下面的 build 方法,以便显示更新后的值。
      // 如果我们不调用 setState() 改变 _counter,那么 build 方法就不会被重新调用,
      // 因此什么都不会发生。
      _counter++;
    });
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    // 每次调用 setState 时,此方法都会被重新运行,例如在上面的 _incrementCounter 方法中。
    //
    // Flutter 框架经过优化,使重新运行 build 方法变得快速,
    // 因此您可以重建任何需要更新的东西,而不是逐个更改小部件实例。
    return Scaffold(
      appBar: AppBar(
        // 在这里,我们从由 App.build 方法创建的 MyHomePage 对象中获取值,
        // 并将其用于设置我们的应用栏标题。
        title: Text(widget.title),
      ),
      body: Center(
        // Center 是一个布局小部件。它接受一个子元素并将其置于父元素的中间。
        child: Column(
          // Column 也是一个布局小部件。它接受一个子元素列表并垂直排列它们。
          // 默认情况下,它水平地调整自身大小以适应其子元素,并尽可能高。
          //
          // 调用 "调试绘制"(在控制台中按 "p" 键,选择 Android Studio 中的 "切换调试绘制" 动作,
          // 或者 Visual Studio Code 中的 "切换调试绘制" 命令)以查看每个小部件的线框图。
          //
          // Column 有许多属性可以控制其自身的大小和子元素的位置。在这里我们使用 mainAxisAlignment 来
          // 垂直居中子元素;主轴是垂直的,因为 Columns 是垂直的(交叉轴是水平的)。
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            const Text(
              '您已经按下了按钮这么多次:',
            ),
            Text(
              '$_counter',
              style: Theme.of(context).textTheme.headlineMedium,
            ),
          ],
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: _incrementCounter,
        tooltip: '增加',
        child: const Icon(Icons.add),
      ), // 这个逗号使得格式化更美观。
    );
  }
}

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

1 回复

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


当然,flutter_manager 并不是一个官方或广泛认可的 Flutter 插件名称,但基于你提到的“设备管理或功能管理插件”,我们可以假设你正在寻找一种方式来管理设备的功能或设置。在 Flutter 社区中,通常我们会使用多个插件来实现不同的设备管理功能,比如电池状态、设备信息、网络连接等。

不过,为了给你一个具体的代码示例,我将展示如何使用一些流行的 Flutter 插件来管理设备的一些基本功能。这些插件可能不完全符合你提到的 flutter_manager,但它们提供了类似的功能。

示例:使用 Flutter 插件管理设备功能

1. 获取设备信息

使用 device_info 插件获取设备信息。

首先,在 pubspec.yaml 文件中添加依赖:

dependencies:
  flutter:
    sdk: flutter
  device_info: ^2.0.3  # 请检查最新版本

然后,在 Dart 代码中获取设备信息:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: DeviceInfoScreen(),
    );
  }
}

class DeviceInfoScreen extends StatefulWidget {
  @override
  _DeviceInfoScreenState createState() => _DeviceInfoScreenState();
}

class _DeviceInfoScreenState extends State<DeviceInfoScreen> {
  DeviceInfoPlugin deviceInfoPlugin = DeviceInfoPlugin();

  Future<void> _getDeviceInfo() async {
    if (Platform.isAndroid) {
      AndroidDeviceInfo androidInfo = await deviceInfoPlugin.androidInfo;
      print('Brand: ${androidInfo.brand}');
      print('Model: ${androidInfo.model}');
      // 可以添加更多信息获取
    } else if (Platform.isIOS) {
      IosDeviceInfo iosInfo = await deviceInfoPlugin.iosInfo;
      print('Name: ${iosInfo.name}');
      print('System Name: ${iosInfo.systemName}');
      // 可以添加更多信息获取
    }
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Device Info'),
      ),
      body: Center(
        child: ElevatedButton(
          onPressed: _getDeviceInfo,
          child: Text('Get Device Info'),
        ),
      ),
    );
  }
}

2. 管理电池状态

使用 battery 插件获取电池状态。

pubspec.yaml 文件中添加依赖:

dependencies:
  battery: ^2.0.0  # 请检查最新版本

在 Dart 代码中获取电池状态:

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

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

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: BatteryInfoScreen(),
    );
  }
}

class BatteryInfoScreen extends StatefulWidget {
  @override
  _BatteryInfoScreenState createState() => _BatteryInfoScreenState();
}

class _BatteryInfoScreenState extends State<BatteryInfoScreen> {
  Battery _battery = Battery();
  BatteryState _batteryState = BatteryState.unknown;
  int _batteryLevel = -1;

  @override
  void initState() {
    super.initState();
    _battery.onBatteryStateChanged.listen((BatteryState state) {
      setState(() {
        _batteryState = state;
      });
    });

    _battery.onBatteryLevelChanged.listen((int level) {
      setState(() {
        _batteryLevel = level;
      });
    });

    // 初始化获取电池状态
    _battery.batteryState.then((state) {
      setState(() {
        _batteryState = state;
      });
    });

    _battery.batteryLevel.then((level) {
      setState(() {
        _batteryLevel = level;
      });
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Battery Info'),
      ),
      body: Center(
        child: Column(
          mainAxisAlignment: MainAxisAlignment.center,
          children: <Widget>[
            Text('Battery State: $_batteryState'),
            SizedBox(height: 10),
            Text('Battery Level: $_batteryLevel%'),
          ],
        ),
      ),
    );
  }
}

注意

  • 上述代码示例仅展示了如何使用特定的 Flutter 插件来获取设备信息和电池状态。
  • 实际应用中,你可能需要处理更多的边缘情况和错误处理。
  • 如果你正在寻找一个综合性的设备管理插件,可能需要自己组合多个插件的功能,或者查找社区中是否有类似的第三方插件。

希望这些示例代码能帮助你开始使用 Flutter 管理设备功能!如果你有更具体的需求或问题,请随时提问。

回到顶部