1. ホーム
  2. flutter

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

2023-08-30 17:23:18

質問

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

実用的な使用例です。

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

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

両方の使用例において、私は、ApplicationStateレベルで複雑なロジックを構築するのではなく、アプリケーションが完全な再起動で進行することを望みます。

ヒントをいただき、ありがとうございます。

どのように解決するのですか?

アプリ全体をステートフルウィジェットにラップすることができます。そして、アプリを再起動するときは、そのステートフルウィジェットを、別の子ウィジェットとして再構築します。 Key .

これでは、アプリの状態が全て失われてしまいます。

import 'package:flutter/material.dart';

void main() {
  runApp(
    RestartWidget(
      child: MaterialApp(),
    ),
  );
}

class RestartWidget extends StatefulWidget {
  RestartWidget({this.child});

  final Widget child;

  static void restartApp(BuildContext context) {
    context.findAncestorStateOfType<_RestartWidgetState>().restartApp();
  }

  @override
  _RestartWidgetState createState() => _RestartWidgetState();
}

class _RestartWidgetState extends State<RestartWidget> {
  Key key = UniqueKey();

  void restartApp() {
    setState(() {
      key = UniqueKey();
    });
  }

  @override
  Widget build(BuildContext context) {
    return KeyedSubtree(
      key: key,
      child: widget.child,
    );
  }
}

この例では、どこからでもアプリをリセットできるように RestartWidget.restartApp(context) .