Flutter: как заставить перезапуск приложения (в режиме производства)?

В режиме производства есть способ принудительно полностью перезагрузить приложение (я не говорю о горячей перезагрузке во время разработки!).

Практические примеры использования:

  • При инициализации приложение обнаруживает, что нет сетевого подключения. Отсутствие сетевого подключения могло бы предотвратить правильный запуск (например, загрузка внешнего ресурса, такого как файлы JSON...).

  • Во время первоначального установления связи необходимо загрузить новые версии некоторых важных ресурсов (например, обновление).

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

Большое спасибо за ваши намеки.

Ответы

Ответ 1

Вы можете обернуть все ваше приложение в statefulwidget. И когда вы хотите перезагрузить приложение, перестройте этот statefulwidget с дочерним элементом, у которого есть другой Key.

Это заставит вас потерять все ваше приложение.

import 'package:flutter/material.dart';

void main() {
  runApp(new RestartWidget(
    child: // new MaterialApp,
  ));
}

class RestartWidget extends StatefulWidget {
  final Widget child;

  RestartWidget({this.child});

  static restartApp(BuildContext context) {
    final _RestartWidgetState state =
        context.ancestorStateOfType(const TypeMatcher<_RestartWidgetState>());
    state.restartApp();
  }

  @override
  _RestartWidgetState createState() => new _RestartWidgetState();
}

class _RestartWidgetState extends State<RestartWidget> {
  Key key = new UniqueKey();

  void restartApp() {
    this.setState(() {
      key = new UniqueKey();
    });
  }

  @override
  Widget build(BuildContext context) {
    return new Container(
      key: key,
      child: widget.child,
    );
  }
}

В этом примере вы можете RestartWidget.restartApp(context) приложение везде, используя RestartWidget.restartApp(context).

Ответ 2

Вы также можете использовать функцию runApp (new MyWidget), чтобы сделать что-то похожее

Вот что делает эта функция:

Надуйте данный виджет и прикрепите его к экрану.

Виджет получает ограничения во время макета, которые заставляют его заполнять весь экран. Если вы хотите выровнять виджет с одной стороны экрана (например, сверху), подумайте о том, чтобы использовать виджет Align. Если вы хотите центрировать свой виджет, вы также можете использовать виджет Центра

Вызов runApp снова отключит предыдущий корневой виджет с экрана и привяжет данный виджет на своем месте. Новое дерево виджетов сравнивается с предыдущим деревом виджета, и любые различия применяются к базовому дереву рендеринга, аналогичному тому, что происходит, когда StatefulWidget перестраивается после вызова State.setState.

https://docs.flutter.io/flutter/widgets/runApp.html