Флаттер: как заставить приложение перезапустить (в рабочем режиме) - PullRequest
0 голосов
/ 01 мая 2018

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

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

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

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

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

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

Ответы [ 2 ]

0 голосов
/ 10 июня 2018

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

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

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

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

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

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

0 голосов
/ 01 мая 2018

Вы можете превратить все ваше приложение в виджет с сохранением состояния. А когда вы захотите перезапустить приложение, перестройте этот 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).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...