You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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"),
        ),
      ),
    );
  }
}

注意事项

  1. 确保设备已安装Flutter环境,flutter命令可在终端正常执行
  2. 移动端限制:iOS/Android受沙箱约束,无法直接执行系统CLI命令,该功能仅支持桌面Flutter应用(Windows/macOS/Linux)
  3. 目标目录需有读写权限,避免因权限问题导致创建失败

内容的提问来源于stack exchange,提问作者pirate

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.11 13:01:03