Jak programowo zamknąć aplikację Flutter. Próbowałem wyskoczyć z jedynego ekranu, ale powoduje to czarny ekran.
107
SystemNavigator.pop()
: NIE DZIAŁA
exit(0)
: Działa, ale Apple może ZAWIESIĆ TWOJĄ APLIKACJĘ, ponieważ programowe zamykanie aplikacji jest sprzeczne z wytycznymi Apple Human Interface.
SystemNavigator.pop()
: Działa i jest ZALECANY sposób zamykania aplikacji.
exit(0)
: Działa również, ale NIE ZALECA SIĘ, ponieważ natychmiast przerywa proces Dart VM i użytkownik może pomyśleć, że aplikacja właśnie się zawiesiła.
SystemNavigator.pop()
to, że nie działa pod emulatorem Androida. Aplikacja nadal działa w tle. Nie jestem więc pewien, czy będzie działać poprawnie na prawdziwym urządzeniu.exit(0)
dla swoich potrzeb.SystemNavigator.pop()
zamyka moją aplikację i wyświetla komunikat o awarii,exit(0)
działa zgodnie z oczekiwaniamiPoniżej działało idealnie ze mną w obu
Android
iiOS
, korzystałemexit(0)
zdart: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), ), ); }
UPDATE, styczeń 2019 r. Preferowanym rozwiązaniem jest:
SystemChannels.platform.invokeMethod('SystemNavigator.pop');
Jak opisano tutaj
źródło
t work for me... I
próbowało dodać przycisku wyjścia do CupertinoTabScafold. Z () => exit (0), daje to pusty ekran z paskiem tabulacji.Możesz to zrobić za pomocą
SystemNavigator.pop()
.źródło
exit(0);
działaSystemNavigator.pop
jest ignorowany, ponieważ wytyczne Apple dotyczące interfejsu ludzkiego stanowią, że aplikacje nie powinny same się wyłączać. Na Androidzie powinno działać i jest preferowane w stosunku dodart:io
metody wyjścia wywołania . Rozważ zgłoszenie problemu: github.com/flutter/flutter/issues/newOdpowiedzi są już dostępne, ale nie kopiuj ich wklejania do bazy kodu, nie wiedząc, co robisz:
Jeśli używasz
SystemChannels.platform.invokeMethod('SystemNavigator.pop');
notatki, dokument wyraźnie wspomina:Możesz użyć
exit(0)
. A to natychmiast zakończy proces Dart VM z podanym kodem zakończenia. Ale pamiętaj, że doktor mówi:W każdym razie doktor również zauważył
SystemChannels.platform.invokeMethod('SystemNavigator.pop');
:Więc pamiętaj, co robisz.
źródło
Wolę używać
Future.delayed(const Duration(milliseconds: 1000), () { SystemChannels.platform.invokeMethod('SystemNavigator.pop'); });
Chociaż wyjście (0) również działa, ale aplikacja zamyka się nagle i nie wygląda ładnie, wygląda na to, że aplikacja uległa awarii.
Future.delayed(const Duration(milliseconds: 1000), () { exit(0); });
źródło
To zadziałało dla mnie;
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), ), ); }
źródło
możesz to nazwać, sprawdzając warunek zależny od platformy. wykonuj różne czynności po kliknięciu dla Androida i iOS.
import 'dart:io' show Platform; import 'package:flutter/services.dart'; RaisedButton( onPressed: () { if (Platform.isAndroid) { SystemNavigator.pop(); } else if (Platform.isIOS) { exit(0); } }, child: Text("close app"), )
źródło