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