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

时间:2019-03-21 13:03:32

标签: dart flutter hot-reload

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

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

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");}),

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

是否有办法在全球范围内获得有关热装弹的通知?

1 个答案:

答案 0 :(得分:2)

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

考虑以下窗口小部件,该窗口小部件在热重载时调用回调,并且不执行其他任何操作:

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