Флетер, як програмно вийти з програми


102

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

Відповіді:


57

Для iOS

SystemNavigator.pop(): НЕ ПРАЦЮЄ

exit(0): Працює, але Apple може ПІДСТАВИТИ ВАШЕ ЗАСТОСУВАННЯ, оскільки це суперечить рекомендаціям Apple Human Interface щодо програмного виходу з програми.


Для Android

SystemNavigator.pop(): Працює та є РЕКОМЕНДОВАНИМ способом виходу з програми.

exit(0): Також працює, але НЕ РЕКОМЕНДУЄТЬСЯ, оскільки він негайно припиняє процес Dart VM, і користувач може подумати, що додаток щойно зазнав аварії.


1
Схоже SystemNavigator.pop(), не працює під емулятором Android. Додаток все ще працює у фоновому режимі. Тому я не впевнений, чи буде він правильно працювати на реальному пристрої.
BambinoUA

2
@AleksTi Він просто виходить із програми, він не закриває процес віртуальної машини. Ви можете спробувати 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 Переважним рішенням є:

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

Як описано тут


що не t work for me... Iнамагався додати кнопку виходу до CupertinoTabScafold. Якщо () => вихід (0), це дає порожній екран із панеллю вкладок.
Рікардо BRGWeb

3
Це працює. Але Apple забороняє користувацькі кнопки виходу і, можливо, відхилить додаток, якщо у вас є
Діма Ростопіра

@HasanAYousef У моєму рішенні отримати повідомлення Невизначене ім'я SystemChannels
user_odoo

36

Ви можете зробити це за допомогою SystemNavigator.pop().


1
І на Android, і на iOS нічого не відбувається. Використання exit(0);справді спрацьовує
Theo Bouwman

2
На iOS SystemNavigator.popігнорується, оскільки в інструкціях Apple щодо людського інтерфейсу зазначено, що програми не повинні виходити самі. На Android це повинно працювати, і це кращий dart:ioспосіб виходу із виклику . Подумайте про подання проблеми: github.com/flutter/flutter/issues/new
Коллін Джексон,

Будь-яка ідея для iOS, як ми можемо робити метушню?
iPatel

@iPatel Ви можете використовувати exit (0) для iOS, і все.
CopsOnRoad

Йо, але як щодо відхилення; (як ви сказали у коментарі вище
iPatel

31

Відповіді вже надані, але, будь ласка, не просто копіюйте їх, вставляючи у свою базу коду, не знаючи, що ви робите:

Якщо ви використовуєте SystemChannels.platform.invokeMethod('SystemNavigator.pop');зауваження, що в документі чітко згадується:

Доручає системному навігатору видалити цю активність зі стеку та повернутися до попередньої.

У iOS виклики цього методу ігноруються, оскільки в інструкціях Apple щодо людського інтерфейсу зазначено, що програми не повинні виходити самі.

Можна використовувати exit(0). І це негайно припинить процес Dart VM із заданим кодом виходу. Але пам’ятайте, що документ говорить:

Це не чекає припинення будь-яких асинхронних операцій. Тому використання виходу дуже ймовірно втратить дані.

У будь-якому випадку доктор також зазначив SystemChannels.platform.invokeMethod('SystemNavigator.pop');:

Цей метод слід віддавати перевагу виклику методу виходу dart: io, оскільки останній може змусити базову платформу діяти так, ніби додаток аварійно завершив роботу.

Тож, пам’ятайте, що ви робите.


10
Ви написали стільки розумних приміток, але ... який правильний спосіб програмно вийти з програми без потенційного призупинення в iOS, як описано нижче?
BambinoUA

4

Я вважаю за краще використовувати

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

Хоча вихід (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.