如何在Flutter项目的Dart文件中点击按钮执行CLI命令?

当点击Boilerplate button时,希望在Flutter的project/dart文件中执行CLI命令flutter create projectName,以下是两种实现方式的具体应用:
方式一:使用dart:io的Process.run
无需额外依赖,直接用Dart内置的dart:io库调用系统命令,适合轻量场景:
import 'dart:io'; import 'package:flutter/material.dart'; class ProjectCreator extends StatefulWidget { const ProjectCreator({super.key}); @override State<ProjectCreator> createState() => _ProjectCreatorState(); } class _ProjectCreatorState extends State<ProjectCreator> { Future<void> createFlutterProject() async { // 替换为你需要的项目名称和目标目录 const projectName = "my_new_flutter_project"; const targetDir = "/Users/yourname/Projects"; final result = await Process.run( "flutter", ["create", projectName], workingDirectory: targetDir, ); // 根据执行结果给出反馈 if (mounted) { if (result.exitCode == 0) { ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text("项目创建成功:${result.stdout}")), ); } else { ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text("创建失败:${result.stderr}")), ); } } } @override Widget build(BuildContext context) { return Scaffold( body: Center( child: ElevatedButton( onPressed: createFlutterProject, child: const Text("Boilerplate button"), ), ), ); } }
方式二:使用shell包
需要先在pubspec.yaml中添加依赖:
dependencies: shell: ^1.0.0 # 可替换为最新版本
通过shell包可以更便捷地执行命令,支持链式操作(比如切换目录):
import 'package:flutter/material.dart'; import 'package:shell/shell.dart'; class ProjectCreator extends StatefulWidget { const ProjectCreator({super.key}); @override State<ProjectCreator> createState() => _ProjectCreatorState(); } class _ProjectCreatorState extends State<ProjectCreator> { Future<void> createFlutterProject() async { final shell = Shell(); try { // 切换到目标目录并执行创建命令 await shell .cd("/Users/yourname/Projects") .run("flutter create my_new_flutter_project"); if (mounted) { ScaffoldMessenger.of(context).showSnackBar( const SnackBar(content: Text("项目创建成功")), ); } } catch (e) { if (mounted) { ScaffoldMessenger.of(context).showSnackBar( SnackBar(content: Text("创建失败:$e")), ); } } } @override Widget build(BuildContext context) { return Scaffold( body: Center( child: ElevatedButton( onPressed: createFlutterProject, child: const Text("Boilerplate button"), ), ), ); } }
注意事项
- 确保设备已安装Flutter环境,
flutter命令可在终端正常执行 - 移动端限制:iOS/Android受沙箱约束,无法直接执行系统CLI命令,该功能仅支持桌面Flutter应用(Windows/macOS/Linux)
- 目标目录需有读写权限,避免因权限问题导致创建失败
内容的提问来源于stack exchange,提问作者pirate
相关产品推荐
相关产品推荐

