9

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

我知道该类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");}),

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

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

4

1 回答 1

10

覆盖子类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(),
  ),
)
于 2019-03-21T14:19:58.840 回答