プログラムでアプリを終了する方法をフラッター


102

Flutterアプリケーションをプログラムで閉じるにはどうすればよいですか?唯一の画面をポップしようとしましたが、画面が真っ暗になります。

回答:


57

iOSの場合

SystemNavigator.pop():動作しません

exit(0):作品AppleはありYOUR APPをSUSPENDそれはプログラムでアプリを終了するには、Appleのヒューマンインターフェイスガイドラインに反対だから。


アンドロイド用

SystemNavigator.pop():動作し、アプリを終了するための推奨される方法です。

exit(0):これも機能しますが、Dart VMプロセスがすぐに終了し、ユーザーがアプリがクラッシュしたと思う可能性があるため、お勧めません


1
SystemNavigator.pop()Androidエミュレータで動作していないようです。アプリはまだバックグラウンドで動作しています。そのため、実際のデバイスで正しく機能するかどうかはわかりません。
BambinoUA

2
@AleksTiアプリを終了するだけで、VMプロセスをシャットダウンしません。あなたはexit(0)あなたの必要性のために試みるかもしれません。
CopsOnRoad

SystemNavigator.pop()アプリを終了し、クラッシュのメッセージを表示し、exit(0)期待どおりに機能します
シャンクス

138

以下は両方で私と完璧に連携しました、AndroidそしてiOS、私はexit(0)から使用しましたdart:io

import 'dart:io';

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: new Text(widget.title),
      ),
      body: new ... (...),
          floatingActionButton: new FloatingActionButton(
            onPressed: ()=> exit(0),
            tooltip: 'Close app',
            child: new Icon(Icons.close),
          ), 
    );
  }

2019年1月の更新 好ましい解決策は次のとおりです。

SystemChannels.platform.invokeMethod('SystemNavigator.pop');

ここで説明されているように


それはt work for me... I、CupertinoTabScafoldに終了ボタンを追加しようとしませんでした。()=> exit(0)を使用すると、タブバー付きの空白の画面が表示されます。
リカルドBRGWeb 2018

3
できます。しかし、Appleはカスタム終了ボタンを禁止しており、アプリがある場合はおそらく拒否します
Dima Rostopira 2018

私の解決策メッセージ未定義の名前SystemChannelsを取得するには@HasanAYousef
user_odoo

36

これはで行うことができますSystemNavigator.pop()


1
AndroidとiOSの両方で何も起こりません。使用exit(0);は機能します
Theo Bouwman 2017

2
iOSでは、SystemNavigator.popAppleのヒューマンインターフェイスガイドラインにアプリケーションが終了してはならないと記載されているため、無視されます。Androidでは機能するはずであり、dart:ioのexitメソッドを呼び出すよりも優先されます。問題の提出を検討してください:github.com/flutter/flutter/issues/new
Collin Jackson

iOSのアイデアは、フラッターでどのように行うことができますか?
iPatel

@iPatel iOSではexit(0)を使用できます。それだけです。
CopsOnRoad

しかし、どのような拒否についてヨ;(上記のコメントで語ったよう
iPatel

31

回答はすでに提供されていますが、何をしているのかを知らずに、それらをコピーしてコードベースに貼り付けないでください。

使用する場合はSystemChannels.platform.invokeMethod('SystemNavigator.pop');ドキュメントが明確に言及していることに注意してください。

このアクティビティをスタックから削除して前のアクティビティに戻るようにシステムナビゲータに指示します。

iOSでは、Appleのヒューマンインターフェイスガイドラインにアプリケーションが終了してはならないと記載されているため、このメソッドの呼び出しは無視されます。

使用できます exit(0)。これにより、指定された終了コードでDartVMプロセスがすぐに終了します。しかし、ドキュメントが言うことを覚えておいてください:

これは、非同期操作が終了するのを待ちません。したがって、exitを使用すると、データが失われる可能性が非常に高くなります。

とにかく、ドキュメントもメモしましたSystemChannels.platform.invokeMethod('SystemNavigator.pop');

このメソッドは、dart:ioのexitメソッドを呼び出すよりも優先する必要があります。後者の場合、基盤となるプラットフォームがアプリケーションがクラッシュしたかのように動作する可能性があるためです。

だから、あなたがしていることを覚えておいてください。


10
あなたは非常に多くの巧妙なメモを書きましたが...以下に説明するように、iOSで停止する可能性なしにプログラムでアプリを終了する正しい方法は何ですか?
BambinoUA

4

私は使用することを好む

 Future.delayed(const Duration(milliseconds: 1000), () {
        SystemChannels.platform.invokeMethod('SystemNavigator.pop');
      });

exit(0)も機能しますが、アプリが突然閉じて見栄えが悪くなりますが、アプリがクラッシュしたようです。

 Future.delayed(const Duration(milliseconds: 1000), () {
       exit(0);
      });

2

これは私にとってはうまくいきました。

import 'dart:io';

@override
Widget build(BuildContext context) {
  return new Scaffold(
    appBar: new AppBar(
      title: new Text(widget.title),
    ),
    body: new ... (...),
      floatingActionButton: new FloatingActionButton(
        onPressed: ()=> exit(0),
        tooltip: 'Close app',
        child: new Icon(Icons.close),
      ), 
  );
}

-1

以下は、AndroidとiOSの両方のインポート 'dart:io'で完全に機能しました。

  @override
  Widget build(BuildContext context) {
    return new Scaffold(
      appBar: new AppBar(
        title: new Text(widget.title),
      ),
      body: new ... (...),
          floatingActionButton: new FloatingActionButton(
            onPressed: ()=> SystemNavigator.pop(),
            tooltip: 'Close app',
            child: new Icon(Icons.close),
          ), 
    );
  }

1
SystemNavigator.pop()iOSでは動作しません。私の答えを読んでください。少なくとも今日の時点では、iOSアプリを終了する方法はありません。
CopsOnRoad
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.