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

How to detect hot reload inside the code of a Flutter App?

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

我知道 State class 上存在 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 中有没有办法在全球范围内获得有关热重载的通知?

覆盖 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(),
  ),
)