Jak programowo zamknąć aplikację Flutter. Próbowałem wyskoczyć z jedynego ekranu, ale powoduje to czarny ekran.
Jak programowo zamknąć aplikację Flutter. Próbowałem wyskoczyć z jedynego ekranu, ale powoduje to czarny ekran.
Odpowiedzi:
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.
exit(0)
dla swoich potrzeb.
SystemNavigator.pop()
zamyka moją aplikację i wyświetla komunikat o awarii, exit(0)
działa zgodnie z oczekiwaniami
Poniżej działało idealnie ze mną w obu Android
i iOS
, korzystałem exit(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
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()
.
exit(0);
działa
SystemNavigator.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 do dart:io
metody wyjścia wywołania . Rozważ zgłoszenie problemu: github.com/flutter/flutter/issues/new
Odpowiedzi 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:
Nakazuje nawigatorowi systemowemu usunięcie tego działania ze stosu i powrót do poprzedniego działania.
W systemie iOS wywołania tej metody są ignorowane, ponieważ wytyczne Apple dotyczące interfejsu ludzkiego stanowią, że aplikacje nie powinny same się zamykać.
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:
To nie czeka na zakończenie jakichkolwiek operacji asynchronicznych. Dlatego użycie wyjścia może spowodować utratę danych.
W każdym razie doktor również zauważył SystemChannels.platform.invokeMethod('SystemNavigator.pop');
:
Ta metoda powinna być preferowana w stosunku do wywoływania metody wyjścia dart: io, ponieważ ta ostatnia może spowodować, że platforma bazowa będzie działać tak, jakby aplikacja uległa awarii.
Więc pamiętaj, co robisz.
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);
});
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),
),
);
}
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"),
)
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.