保存时热重载

3

我目前在OSX上使用终端和vim作为Flutter开发环境。一切都很顺利,但当我保存任何dart文件时,应用程序不会重新加载。有没有办法触发这种行为?目前我必须转到终端并按“r”才能看到我的更改。


我从Danny Tuppeny那里得到的链接 https://github.com/flutter/flutter/blob/35ad2a786dd92ab3343f55e53b069c433d81895b/packages/flutter_tools/lib/src/commands/run.dart#L152 - Günter Zöchbauer
有一个更复杂的服务API,允许执行各种命令和查询。https://github.com/flutter/flutter/blob/master/packages/flutter_tools/doc/daemon.md(链接也来自Danny) - Günter Zöchbauer
5个回答

阿里云服务器只需要99元/年,新老用户同享,点击查看详情
6

抱歉打广告,但我写了一个非常简单的 插件 来处理这个问题。

它利用Flutter的 --pid-file 命令行标志来发送 SIGUSR1 信号。

通过将此添加到 autocmd,您可以实现与我的两行插件相同的结果。

silent execute '!kill -SIGUSR1 "$(cat /tmp/flutter.pid)"'

使用--pid-file标志启动Flutter。


3
不错的起点!我基于这个做了一个插件hankchiutw/flutter-reload.vim,但是不需要使用 --pid-file 标志。随时尝试一下吧! - hankchiutw
@HankChiu,我在使用Atom。你能告诉我如何在文件更改时触发热重载吗? - user13427040
@AdnanBadshah 你试过atom-flutter吗? - hankchiutw

2
我基于使用SIGUSR1来终止进程的方法,制作了一个vim插件hankchiutw/flutter-reload.vim

使用此插件时,您无需使用--pid-file标志。(感谢pgrep :))

只需执行flutter run,修改*.dart文件并查看重新加载即可。


嗨 @hank-chiu,我正在尝试你的插件。我在tmux中打开了一个窗格,其中运行着flutter run命令,另一个窗格中是vim。当我保存时,它没有刷新。我错过了什么吗? - Yasin Shuman

1
我用一个叫做entr的小工具完成了它。在OS/X上,你可以从brew安装它:brew install entr。该工具的主页位于http://eradman.com/entrproject/。 然后你像@nobody_nowhere建议的那样使用pidfile启动flutter run。 如何运行entr取决于服务级别。在最简单的情况下,你只需要执行find lib/ -name '*.dart' | entr -p kill -USR1 $(cat /tmp/flutter.pid)。 但这种调用不会检测源树中的新文件(因为find仅在开始时构建要监视的文件列表一次)。你可以使用稍微复杂的一行命令:
while true
do
    find lib/ -name '*.dart' | \
        entr -d -p kill -USR1 $(cat /tmp/flutter.pid)
done

-d选项使得entr在检测到目录中有新文件并且循环再次运行时退出。

我个人使用更加复杂的方法。我使用Redux,并且对中间件或其他状态文件的更改无法通过热重载生效,它不会捕获这些更改。因此,你需要使用热重启。 我有一个名为hotrestarter.sh的脚本:

#!/bin/bash

set -euo pipefail
PIDFILE="/tmp/flutter.pid"

if [[ "${1-}" != "" && -e $PIDFILE ]]; then
    if [[ "$1" =~ \/state\/ ]]; then
        kill -USR2 $(cat $PIDFILE)
    else
        kill -USR1 $(cat $PIDFILE)
    fi
fi
它检查修改后的文件是否位于/state子目录中,如果是,则进行热重启,否则进行热重载。我这样调用脚本:
while true
do
    find lib/ -name '*.dart' | entr -d -p ./hotreloader.sh /_
done

/_ 参数使得 entr 将文件名传递给被调用的程序。


-1
你没有说明是哪个平台,但所有平台都有一个“监视器”应用程序,可以在树中的任何文件更改时运行命令。你需要运行其中之一。

-2

vscode有这个功能。如果你不介意转到vscode,你就可以直接使用它。你还可以联系作者,看看他们有没有关于在vim中如何实现的建议,或者直接检查源代码。很可能vim也有一种机制来实现这个功能。


我实际上花了很多时间定制VIM,使其在这一点上值得迁移。我希望Flutter能够将其工具与当前支持保存时热重载的react-native相媲美。 - Bashar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,