Flutter中能否执行外部命令?有无类似Java Process、Go exec的API
Dart/Flutter 调用外部程序的实现方案
Dart 标准库原生提供了和 Java Process 类、Go exec 包对等的进程操作能力,不需要依赖第三方插件,即可在 Windows、macOS 端的 Flutter 桌面应用中实现调用外部程序的需求。
核心API说明
对应的能力全部在 dart:io 库的 Process 类中,支持的核心操作包括:
- 启动指定路径的外部可执行程序,传入启动参数
- 读写进程的标准输入、标准输出、错误输出流
- 监听进程退出事件、获取进程退出码
- 主动终止运行中的进程
- 配置进程启动模式,比如是否继承当前控制台、是否后台分离运行
基础使用示例
1. 交互式启动进程(需要和进程做IO交互时使用)
用 Process.start 方法启动,拿到进程实例后可以持续和进程交互:
import 'dart:io'; void launchExternalApp() async { // Windows 示例:启动记事本打开指定文件 // macOS 可替换为目标可执行程序路径,比如调用系统打开能力用 'open' final process = await Process.start( 'notepad.exe', ['C:/demo/test.txt'], mode: ProcessStartMode.normal, ); // 监听进程标准输出 process.stdout .transform(const SystemEncoding().decoder) .listen((content) => print('进程输出:$content')); // 监听进程错误输出 process.stderr .transform(const SystemEncoding().decoder) .listen((content) => print('进程报错:$content')); // 等待进程退出,获取退出码 final exitCode = await process.exitCode; print('外部程序已退出,退出码:$exitCode'); }
2. 一次性执行命令(不需要持续交互时使用)
如果只需要执行外部程序/命令,拿到执行完成后的结果,可以用更简洁的 Process.run 方法:
void runCommand() async { // macOS 示例:打开系统文稿目录 // Windows 调用系统内置命令(如ipconfig、dir)需要写成: // final res = await Process.run('cmd.exe', ['/c', 'ipconfig']); final res = await Process.run('open', ['/Users/your_name/Documents']); print('执行结果输出:${res.stdout}'); print('执行错误输出:${res.stderr}'); print('退出码:${res.exitCode}'); }
注意事项
- 这套API仅支持 Flutter 桌面端(Windows/macOS/Linux)、Dart 命令行程序使用,Web、Android、iOS 平台因系统权限限制不支持这类任意外部进程调用能力。
- 不要硬编码文件路径,可配合
dart:io提供的Platform类做跨平台路径适配,避免不同系统下路径分隔符、可执行文件后缀差异导致的报错。 - 启动分离模式的进程时,当前Flutter应用退出不会连带终止拉起的外部程序,可根据业务需求选择对应的启动模式。
内容的提问来源于stack exchange,提问作者Spencer Nold
相关产品推荐
相关产品推荐

