我目前在OSX上使用终端和vim作为Flutter的开发环境。事情进展顺利,但是当我保存任何飞镖文件时应用程序不会重新加载。有没有办法触发这种行为?目前我必须去终端并点击" r"看到我的变化。
答案 0 :(得分:6)
很抱歉,但是我写了一个非常简单的plugin来处理这个问题。
它利用Flutter的--pid-file
命令行标志向其发送SIGUSR1
信号。
通过将其添加到autocmd
silent execute '!kill -SIGUSR1 "$(cat /tmp/flutter.pid)"'
然后使用--pid-file
标志启动Flutter。
答案 1 :(得分:2)
我用SIGUSR1
杀死了一个vim插件hankchiutw/flutter-reload.vim。
此插件无需使用--pid-file
标志。 (感谢pgrep
:))
只需执行flutter run
,修改* .dart文件并查看重新加载。
答案 2 :(得分: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
子目录中,并且是否热启动或热重新加载为true。我这样称呼脚本:
while true
do
find lib/ -name '*.dart' | entr -d -p ./hotreloader.sh /_
done
/_
参数使entr
将文件名传递给正在调用的程序。
答案 3 :(得分:0)
你不会说什么平台,但所有平台都有一个观察者"可以在树中的任何文件发生更改时运行命令的应用程序。你需要运行其中一个。
答案 4 :(得分:0)
以下内容将在每次写入*.dart
文件(添加到.vimrc
)中触发Flutter重新加载:
function! HotReload() abort
if !empty(glob("/tmp/flutter.pid"))
silent execute '!kill -SIGUSR1 "$(cat /tmp/flutter.pid)"'
endif
endfunction
autocmd BufWritePost *.dart call HotReload()
如果您还在NeoVim中使用:terminal
,则可以直接在NeoVim中创建一个自定义命令来运行带有--pid-file
标志的Flutter。像这样:
command! FlutterRun :8split +terminal flutter run --pid-file /tmp/flutter.pid
这将创建一个:FlutterRun
命令,该命令将在拆分中打开一个新的终端实例并自动运行Flutter(带有热重载)。
答案 5 :(得分:-1)
vscode具有此功能。如果你不介意转移到vscode,你可以开箱即用。您也可以联系作者,看看他们是否有任何关于如何在vim中执行此操作或直接检查源的建议。很可能vim会有这样做的机制。