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 に答える