Dart::Process.run()将stdout作为流而不是字符串获取,就像Process.start()一样

Dart::Process.run()将stdout作为流而不是字符串获取,就像Process.start()一样,dart,Dart,我想在dart中使用或逐个执行一些进程 我想显示这个过程的详细日志。但问题是,每当我使用run时,它都会以字符串形式提供标准输出,即在进程结束时。但是我想在进程执行时显示日志 原因run正在向我们返回ProcessResult的实例,而不是Process,返回的标准输出是字符串 必须使用stdout.write(cleanProcess.stdout)在运行的情况下 或 现在,在start()的情况下,我得到了所需的stdout作为流,但唯一的问题是start将我们返回到过程,而不是真正等待过程

我想在dart中使用或逐个执行一些进程

我想显示这个过程的详细日志。但问题是,每当我使用
run
时,它都会以字符串形式提供标准输出,即在进程结束时。但是我想在进程执行时显示日志

原因
run
正在向我们返回
ProcessResult
的实例,而不是
Process
,返回的标准输出是字符串

必须使用
stdout.write(cleanProcess.stdout)
运行的情况下

现在,在
start()
的情况下,我得到了所需的stdout作为流,但唯一的问题是
start
将我们返回到
过程,而不是真正等待
过程完成

可以使用
stdout.addStream(buildProcess.stdout)将标准输出显示为流


我试图执行的代码,并显示详细信息

打印(“高供给执行器:颤振清洁”);
var cleanProcess=await Process.run('flatter',[“clean”,“--verbose”],
工作目录:“${folder.path}”);
写入(cleanProcess.stdout)//只有一次成功。像溪流一样需要。
打印(“高供应执行器:颤振发布”);
var pubGetProcess=wait Process.run('flatter',//或者我们可以使用start并等待流程完成吗
[“pub”、“get”、“verbose”],
工作目录:“${folder.path}”);
write(pubGetProcess.stdout);
打印(“高供应执行器:颤振构建apk”);
var buildProcess=await Process.run(
“颤振”[“构建”、“apk”、“--verbose”、generatedParams],
工作目录:“${folder.path}”);
编写(buildProcess.stdout);

TL;DR

Prcocess.run()
的情况下,我是否可以将stdout作为流获取,或者在
Process.start()的情况下,我们是否可以等待进程完成,然后再执行另一个进程

感谢您的帮助

编辑:1

正如@julemand101建议在流程完成后使用并等待其返回,它与我的案例配合良好,尚未遇到任何问题,但正如他在文档中提到并指出的,这并不可靠,因此我们正在寻找更好的具体解决方案。

来源:

Process.start()
用于与代码交互。未来给了我们一个过程,在它完成启动之后,但是当我们有了这个过程时,这个过程仍然在运行

当future完成时,进程启动,您的代码可以与进程交互:写入stdin、侦听stdout等等

现在我们可以通过
Process.stdout
访问整数流,并使用utf8解码器对其进行解析

示例代码:

main() async {
  var process = await Process.start('cat', []);
  process.stdout
      .transform(utf8.decoder)
      .forEach(print);
  process.stdin.writeln('Hello, world!');
  process.stdin.writeln('Hello, galaxy!');
  process.stdin.writeln('Hello, universe!');
}

在这个答案的范围之外,我们可以操作流程对象、发送中断、终止等。当流程结束时,我们希望在流上完成一个事件。

Genius@julemand101感谢您的帮助。它起作用了:)你能不能把它作为答案,这样我就可以接受它。我删除了我的评论,因为它有点复杂。如果阅读
exitCode
的文档,您可以在底部看到:“不能保证在返回的将来完成时,stdout和stderr已经完成了对进程缓冲输出的报告。要确保捕获了所有输出,请等待流上的done事件。”因为我现在真的没有时间制定一个防弹解决方案,所以我只是删除了我的评论。:)没问题,谢谢你的帮助。现在它对我有效,但让我们等待具体的解决方案或更多的输入(如果有)。这是使用
stdout.addStream(buildProcess.stdout)
实现相同的行为。在“
运行”
的情况下,我想知道如何等待上一个进程完成,或者在进程中显示详细信息。