Как обнаружить горячую перезагрузку внутри кода приложения Flutter? - PullRequest
0 голосов
/ 21 марта 2019

У меня есть файл актива, который необходимо обработать, прежде чем его можно будет использовать. Этот файл ресурсов будет сильно отредактирован, и я не хотел бы перезапускать приложение каждый раз, когда я делаю правку.

Мне известно о существовании метода 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 Ответ

2 голосов
/ 21 марта 2019

Переопределение метода 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(),
  ),
)
...