【问题标题】:Hot reload on save保存时热重载
【发布时间】:2018-08-26 16:29:59
【问题描述】:

我目前在 OSX 上使用终端和 vim 作为 Flutter 的开发环境。除了当我保存任何 dart 文件时应用程序不会重新加载之外,一切进展顺利。有没有办法触发这种行为?目前我必须去终端并点击“r”来查看我的更改。

【问题讨论】:

标签: macos vim flutter hot-reload


【解决方案1】:

我做了一个vim插件hankchiutw/flutter-reload.vim基于用SIGUSR1杀掉。

您不必在此插件中使用--pid-file 标志。 (感谢pgrep :))

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

【讨论】:

  • 嘿@hank-chiu,我现在正在试用你的插件。我在 tmux 中打开了一个窗格,其中运行了颤振,另一个窗格中运行了 vim。当我保存时,它并不令人耳目一新。我错过了什么吗?
【解决方案2】:

我使用名为 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】:

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

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

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

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

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

    【讨论】:

    • 好的起点!我基于此制作了一个插件hankchiutw/flutter-reload.vim,但不需要使用--pid-file 标志。随意尝试一下!
    • @HankChiu 我在原子上。你能告诉我如何在文件发生更改时触发热重载吗?
    • @AdnanBadshah 你试过atom-flutter吗?
    【解决方案4】:

    vscode 有这个功能。如果您不介意迁移到 vscode,您可以直接使用它。您也可以联系作者,看看他们是否对如何在 vim 中执行此操作有任何建议或直接查看源代码。 vim 很可能会有这样做的机制。

    【讨论】:

    • 我实际上已经花了很多时间自定义 VIM 以使迁移变得有价值。我希望 Flutter 能够将其工具与 react-native 相提并论,后者目前支持保存时热重载。
    【解决方案5】:

    你没有说什么平台,但所有平台都有一个“观察者”应用程序,当树中的任何文件发生变化时,它可以运行命令。您需要运行其中一个。

    【讨论】:

      猜你喜欢
      • 2023-03-15
      • 2021-03-28
      • 2020-05-20
      • 2016-10-10
      • 2020-10-26
      • 2021-09-07
      • 2021-05-04
      • 2019-07-30
      相关资源
      最近更新 更多