web-dev-qa-db-ja.com

Flutter:(本番モードで)アプリケーションを強制的に再起動する方法は?

プロダクションモードでは、アプリケーションを完全に再起動する方法があります(私はnotホットリロードについて話します開発時に!)。

実用的な使用例:

  • 初期化プロセスで、アプリケーションはネットワーク接続がないことを検出します。ネットワーク接続の欠如により、正しい起動が妨げられた可能性があります(たとえば、JSONファイルなどの外部リソースの読み込み...)。

  • 最初のハンドシェイク中に、いくつかの重要なリソースの新しいバージョンをダウンロードする必要があります(更新の種類)。

どちらのユースケースでも、ApplicationStateレベルで複雑なロジックを構築するのではなく、アプリケーションを完全に再起動してください。

あなたのヒントに感謝します。

24
boeledi

アプリ全体をステートフルウィジェットにラップできます。アプリを再起動する場合は、別の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)を使用してどこからでもアプリをリセットできます。

38
Rémi Rousselet

RunApp(new MyWidget)関数を使用して同様のことを行うこともできます

これはこの関数が行うことです:

指定されたウィジェットを膨らませて画面に添付します。

ウィジェットには、レイアウト中に画面全体に表示されるように強制する制約が与えられます。ウィジェットを画面の片側(上部など)に揃える場合は、Alignウィジェットの使用を検討してください。ウィジェットを中央に配置したい場合は、中央ウィジェットを使用することもできます

RunAppを再度呼び出すと、画面から以前のルートウィジェットがデタッチされ、所定のウィジェットがその場所にアタッチされます。新しいウィジェットツリーは前のウィジェットツリーと比較され、State.setStateを呼び出した後にStatefulWidgetが再構築された場合と同様に、基になるレンダーツリーに違いが適用されます。

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

4
David H Moreno