我有一个资产文件,需要使用它才能处理。此资产文件将被大量编辑,我希望每次进行编辑时都不必重新启动应用程序。
我知道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");}),
但是,将它们添加到单个页面意味着只要页面在堆栈中就可以使用。并且将它们添加到多个页面意味着这些挂钩将执行一次以上。
是否有办法在全球范围内获得有关热装弹的通知?
答案 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(),
),
)