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

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

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

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

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

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

большое спасибо за ваши подсказки.

2 ответов


вы можете обернуть все приложение в 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).


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

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

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

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

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

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