Flutter Hot Reload修改代码没反应是怎么回事?
大家好,我在用Flutter开发页面时遇到个怪问题:刚才修改了容器的颜色和文字内容,按住热重载按钮显示”Reloaded 1 of 2 libraries”,但界面上一点变化都没有,非要手动重启应用才能看到修改。
之前调试这个页面的时候Hot Reload明明好好的,刚才尝试过:flutter clean、重启Android Studio、甚至重装Flutter SDK都没用。更奇怪的是新建的测试页面Hot Reload又能正常工作…
现在修改的代码是这样的:
Container(
color: Colors.red, // 刚刚改成Colors.blue
child: Text("旧文本", // 刚刚改成"新文本",
style: TextStyle(fontSize: 20),
),
)
控制台没有报错,但每次修改后都会出现这个提示:Nothing changed. Applying changes took 232ms,感觉像是项目配置哪里卡住了?
你描述说新建页面能正常热重载,说明 SDK 和编辑器没问题,问题大概率出在当前这个页面的「状态持久化」上。Flutter 在热重载时不会重走 initState,也不会清空 StatefulWidget 的状态,如果你这个 Container 所在的 Widget 是一个 StatefulWidget,并且颜色或文本是从 state 里读的(比如 this.color / this.text),而你又没把新值传进去,那它当然不会变。
先检查你的 widget 构造是不是这样写的:
如果你在 build 里用了 this.text 或 this.color,但热重载时父组件没触发重建,那传进来的参数还是旧的。这时候即使你改了默认值,也看不到效果。
解决办法很简单:
改成用 StatelessWidget,或者确保每次热重载后父级会重新创建这个 widget。最直接验证方式是在调用处加个随机 key:
或者干脆在修改代码后手动点 Hot Restart(全量重启),看是否生效。如果 Hot Restart 能生效,那基本确定是热重载的状态隔离问题。
另外一个小概率情况是编译缓存错乱,虽然你 clean 过,但可以再试试删掉 build 目录和 .dart_tool 目录,然后 flutter pub get 一次。
总之,别迷信 Hot Reload 万能,StatefulWidget + 构造参数传递的情况下,热重载经常“看起来没反应”,这是正常现象,不是环境坏了。
pubspec.yaml没有语法问题,有时候隐式的格式错误也会导致这种现象。实在不行,删掉.dart_tool和build文件夹重新构建。