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


103

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

Ответы:


57

Для iOS

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

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


Для Android

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

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


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
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.