如何检测 Flutter App 代码中的热重载?

Posted

技术标签:

【中文标题】如何检测 Flutter App 代码中的热重载?【英文标题】:How to detect hot reload inside the code of a Flutter App? 【发布时间】:2019-08-12 08:18:21 【问题描述】:

我有一个资产文件需要先处理才能使用。此资产文件将被大量编辑,我希望每次进行编辑时都不必重新启动应用程序。

我知道State 类上存在reassemble 方法。但是,这需要有一个虚拟小部件来覆盖此方法并将其放在应用程序中的某个位置以获取有关热重载的通知。

class WdHotReloadNotifier extends StatefulWidget

  final Function callback;
  WdHotReloadNotifier(this.callback);
  @override
  State<StatefulWidget> createState() => WdHotReloadNotifierState(this.callback);

class WdHotReloadNotifierState extends State<WdHotReloadNotifier>

  Function callback;
  WdHotReloadNotifierState(this.callback);
  @override
  void reassemble()
  
    super.reassemble();
    callback();
  
  @override
  Widget build(BuildContext context) 
    return Container();
  

然后我可以这样使用它:

WdHotReloadNotifier(()print("HOT REALOADED 1");),
WdHotReloadNotifier(()print("HOT REALOADED 2");),

但是,将这些添加到单个页面意味着只要页面在堆栈中,它就可以工作。并且将它们添加到多个页面意味着挂钩将执行多次。

flutter 有没有办法在全局范围内获得关于热重载的通知?

【问题讨论】:

【参考方案1】:

State 子类上覆盖reassemble 方法是您想要的。 但您可以将小部件定位到其他位置以更改行为。

考虑以下小部件,它在热重载时调用回调并且什么都不做:

class ReassembleListener extends StatefulWidget 
  const ReassembleListener(Key key, this.onReassemble, this.child)
      : super(key: key);

  final VoidCallback onReassemble;
  final Widget child;

  @override
  _ReassembleListenerState createState() => _ReassembleListenerState();


class _ReassembleListenerState extends State<ReassembleListener> 
  @override
  void reassemble() 
    super.reassemble();
    if (widget.onReassemble != null) 
      widget.onReassemble();
    
  

  @override
  Widget build(BuildContext context) 
    return widget.child;
  

您可以随意插入该小部件。

在单个页面上:

MaterialApp(
  home: ReassembleListener(onReassemble: () => print("Foo"), child: Home()),
)

或者通过包装整个应用程序全局:

ReassembleListener(
  onReassemble: () => print('foo'),
  child: MaterialApp(
    home: Home(),
  ),
)

【讨论】:

最后的sn-p代码就是我想要的!谢谢你:) 这并不完美。但它会一直持续到颤振给我们提供更好的方法。 @Eugene Perfect 就是拥有一个可以通过回调调用的函数,并在发生热重载时得到通知。 嗨,我想知道 热重启(不是热重载)是否有类似的东西?谢谢! @RémiRousselet 抱歉,我发现它不会破坏 本机 ios 代码...所以当我使用库时,飞镖部分被销毁并重新初始化,但本机 swift 部分仍然存在,并且该包会混淆......

以上是关于如何检测 Flutter App 代码中的热重载?的主要内容,如果未能解决你的问题,请参考以下文章

调试时 Flutter VS Code 中的热重启(以前是完全重启)

Flutter:如何强制应用程序重启(在生产模式下)?

Android Studio 中的 Flutter App 不会通过热重载或热重启在虚拟设备上更新

Flutter“不能热加载(hot reload),热重载按钮灰色且无法点击”的解决方案

android中的热更新

Android Studio Flutter 热重载按钮不起作用