Flutter как программно выйти из приложения

103

Как я могу программно закрыть приложение Flutter. Я попытался открыть единственный экран, но это привело к черному экрану.

Тео Боуман
источник

Ответы:

57

Для iOS

SystemNavigator.pop(): НЕ РАБОТАЕТ

exit(0): Работает, но Apple может ПРИОСТАНОВИТЬ ВАШЕ ПРИЛОЖЕНИЕ, поскольку программный выход из приложения противоречит рекомендациям Apple Human Interface.


Для Android

SystemNavigator.pop(): Работает, и это РЕКОМЕНДУЕМЫЙ способ выхода из приложения.

exit(0): Также работает, но НЕ РЕКОМЕНДУЕТСЯ, так как он немедленно завершает процесс виртуальной машины Dart, и пользователь может подумать, что приложение только что упало.

CopsOnRoad
источник
1
Похоже, SystemNavigator.pop()не работает под эмулятором Android. Приложение все еще работает в фоновом режиме. Поэтому я не уверен, будет ли он правильно работать на реальном устройстве.
BambinoUA
2
@AleksTi Он просто выходит из приложения, но не закрывает процесс виртуальной машины. Вы можете попробовать exit(0)по своему усмотрению.
CopsOnRoad
SystemNavigator.pop()закрывает мое приложение и показывает сообщение о сбое, exit(0)работает должным образом
Шанкс
140

Ниже отлично работал со мной в обоих, 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 г. Предпочтительное решение:

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

Как описано здесь

Хасан А Юсеф
источник
это не t work for me... Iпыталось добавить кнопку выхода в CupertinoTabScafold. С () => exit (0) он дает пустой экран с панелью вкладок.
Ricardo BRGWeb
3
Оно работает. Но Apple запрещает настраиваемые кнопки выхода и, вероятно, отклонит приложение, если оно у вас есть
Дима Ростопира
@HasanAYousef В моем решении появляется сообщение Undefined name
SystemChannels
36

Вы можете сделать это с помощью SystemNavigator.pop().

Коллин Джексон
источник
1
И на Android, и на iOS ничего не происходит. Использование exit(0);действительно работает
Тео Боуман
2
В iOS SystemNavigator.popигнорируется, потому что в рекомендациях Apple по пользовательскому интерфейсу указано, что приложения не должны выходить сами. На Android он должен работать и предпочтительнее, чем вызов dart:ioметода exit. Рассмотрите возможность регистрации проблемы: github.com/flutter/flutter/issues/new
Коллин Джексон
Есть идеи для iOS, как мы можем работать с флаттером?
iPatel 06
@iPatel Вы можете использовать exit (0) для iOS, вот и все.
CopsOnRoad
Эй, но как насчет отказа; (как вы сказали в комментарии выше
iPatel
32

Ответы уже предоставлены, но, пожалуйста, не копируйте и вставляйте их в свою базу кода, не зная, что вы делаете:

Если вы используете, SystemChannels.platform.invokeMethod('SystemNavigator.pop');обратите внимание, что документ четко упоминает:

Дает указание системному навигатору удалить это действие из стека и вернуться к предыдущему действию.

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

Вы можете использовать exit(0). И это немедленно завершит процесс Dart VM с заданным кодом выхода. Но помните, что в этом документе говорится:

Это не ожидает завершения каких-либо асинхронных операций. Поэтому использование exit очень вероятно приведет к потере данных.

Во всяком случае, документ также отметил SystemChannels.platform.invokeMethod('SystemNavigator.pop');:

Этот метод следует предпочесть вызову метода exit dart: io, поскольку последний может заставить базовую платформу действовать так, как если бы приложение упало.

Так что помните, что вы делаете.

Бласанка
источник
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