如何通过Flutter代码/API获取Flutter版本及依赖包版本(替代Makefile)
获取Flutter版本及依赖包版本(纯代码实现)
完全可以通过Flutter/Dart代码实现,不需要依赖Makefile。以下是具体实现方案:
一、获取Flutter SDK版本
通过dart:io的Process类执行flutter --version命令,解析输出提取版本号:
import 'dart:io'; Future<String> getFlutterSdkVersion() async { try { final processResult = await Process.run('flutter', ['--version']); if (processResult.exitCode != 0) { return '获取失败:${processResult.stderr}'; } final outputLines = processResult.stdout.toString().split('\n'); for (final line in outputLines) { if (line.startsWith('Flutter')) { return line.split(' ')[1]; } } return '未知版本'; } catch (e) { return '错误:$e'; } }
二、获取依赖包版本
通过读取项目的pubspec.lock文件(该文件记录了所有依赖的实际安装版本),并用yaml库解析内容:
1. 添加依赖
首先在pubspec.yaml中添加yaml包依赖:
dependencies: yaml: ^3.1.2
2. 实现代码
import 'dart:io'; import 'package:yaml/yaml.dart'; Future<Map<String, String>> getDependencyVersions() async { final versionMap = <String, String>{}; try { // 注意:移动端/WEB打包后无法直接访问pubspec.lock,建议构建阶段预生成版本文件 final lockFile = File('pubspec.lock'); if (!await lockFile.exists()) { return {'提示': '未找到pubspec.lock文件'}; } final fileContent = await lockFile.readAsString(); final yamlData = loadYaml(fileContent) as YamlMap; final packages = yamlData['packages'] as YamlMap; packages.forEach((packageKey, packageValue) { final name = packageKey.toString(); final version = (packageValue as YamlMap)['version'].toString(); versionMap[name] = version; }); return versionMap; } catch (e) { return {'错误': e.toString()}; } }
注意事项
- 移动端/WEB适配:打包后的应用无法直接读取项目根目录的
pubspec.lock,建议在构建前通过脚本将依赖版本信息生成一个静态dart文件(比如version_info.dart),运行时直接导入该文件即可。 - Flutter路径问题:执行
flutter命令时,需确保flutter已加入系统PATH;若无法保证,可指定flutter的完整路径(比如Process.run('/usr/local/bin/flutter', ['--version']))。
内容的提问来源于stack exchange,提问作者Pushpam
相关产品推荐
相关产品推荐

