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.