Flutter cara keluar dari aplikasi secara terprogram


107

Bagaimana cara menutup aplikasi Flutter secara terprogram. Saya sudah mencoba memunculkan satu-satunya layar tetapi itu menghasilkan layar hitam.

Jawaban:


66

Untuk iOS

SystemNavigator.pop(): TIDAK BEKERJA

exit(0): Berfungsi tetapi Apple dapat MENANGGUHKAN APLIKASI ANDA karena melanggar pedoman Antarmuka Manusia Apple untuk keluar dari aplikasi secara terprogram.


Untuk Android

SystemNavigator.pop(): Bekerja dan merupakan cara yang DIANJURKAN untuk keluar dari aplikasi.

exit(0): Juga berfungsi tetapi TIDAK DIANJURKAN karena menghentikan proses VM Dart dengan segera dan pengguna mungkin berpikir bahwa aplikasi baru saja rusak.


1
Sepertinya SystemNavigator.pop()tidak berfungsi pada emulator Android. Aplikasi masih bekerja di latar belakang. Jadi saya tidak yakin apakah itu akan berfungsi dengan baik di perangkat nyata.
BambinoUA

2
@AleksTi Ini hanya keluar dari aplikasi, itu tidak menutup proses VM. Anda dapat mencoba exit(0)untuk kebutuhan Anda.
CopsOnRoad

SystemNavigator.pop()keluar dari aplikasi saya dan menampilkan pesan macet, exit(0)berfungsi seperti yang diharapkan
Shanks

147

Di bawah bekerja sempurna dengan saya di keduanya Androiddan iOS, saya digunakan exit(0)daridart: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 Jan 2019 Solusi yang lebih disukai adalah:

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

Seperti yang dijelaskan di sini


yang tidak t work for me... Imencoba menambahkan tombol keluar ke CupertinoTabScafold. Dengan () => exit (0), ini memberikan layar kosong dengan tabbar.
Ricardo BRGWeb

3
Berhasil. Tetapi Apple melarang tombol keluar khusus dan mungkin akan menolak aplikasi jika Anda memilikinya
Dima Rostopira

@HasanAYousef Dalam solusi saya mendapatkan pesan Nama yang tidak
ditentukan SystemChannels

38

Anda bisa melakukan ini dengan SystemNavigator.pop().


1
Tidak ada yang terjadi di Android dan iOS. Menggunakan exit(0);tidak berhasil
Theo Bouwman

2
Di iOS, SystemNavigator.popdiabaikan karena pedoman antarmuka manusia Apple menyatakan bahwa aplikasi tidak boleh keluar sendiri. Di Android, ini harus berfungsi, dan lebih disukai daripada memanggil dart:iometode keluar. Pertimbangkan untuk mengajukan masalah: github.com/flutter/flutter/issues/new
Collin Jackson

Ada ide untuk iOS bagaimana kita bisa melakukan flutter?
iPatel

@iPatel Anda dapat menggunakan exit (0) untuk iOS, itu saja.
CopsOnRoad

Yo tapi bagaimana dengan penolakan; (seperti yang Anda katakan di komentar di atas
iPatel

32

Jawaban sudah disediakan tetapi tolong jangan hanya menyalin dan menempelkannya ke basis kode Anda tanpa mengetahui apa yang Anda lakukan:

Jika Anda menggunakan SystemChannels.platform.invokeMethod('SystemNavigator.pop');catatan bahwa dokumen dengan jelas menyebutkan:

Perintahkan navigator sistem untuk menghapus aktivitas ini dari tumpukan dan kembali ke aktivitas sebelumnya.

Di iOS, panggilan ke metode ini diabaikan karena pedoman antarmuka manusia Apple menyatakan bahwa aplikasi tidak boleh keluar sendiri.

Anda bisa menggunakan exit(0). Dan itu akan menghentikan proses VM Dart segera dengan kode keluar yang diberikan. Tapi ingat dokter itu mengatakan:

Ini tidak menunggu operasi asynchronous berhenti. Oleh karena itu, menggunakan keluar sangat mungkin kehilangan data.

Pokoknya dokter juga mencatat SystemChannels.platform.invokeMethod('SystemNavigator.pop');:

Metode ini sebaiknya lebih disukai daripada memanggil metode keluar dart: io, karena yang terakhir dapat menyebabkan platform yang mendasarinya bertindak seolah-olah aplikasi macet.

Jadi, ingatlah terus apa yang Anda lakukan.


12
Anda menulis begitu banyak catatan cerdas, tetapi ... apa cara yang benar untuk keluar secara terprogram dari aplikasi tanpa potensi penangguhan di iOS seperti yang dijelaskan di bawah ini?
BambinoUA

6

Saya lebih suka menggunakan

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

Meskipun, exit (0) juga berfungsi tetapi aplikasi menutup secara tiba-tiba dan tidak terlihat bagus, sepertinya aplikasi tersebut macet.

 Future.delayed(const Duration(milliseconds: 1000), () {
       exit(0);
      });

2

Ini berhasil untuk saya;

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

Anda dapat memanggil ini dengan memeriksa kondisi ketergantungan platform. melakukan tindakan berbeda dengan klik untuk android dan 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"),
            )

-3

Di bawah ini bekerja sempurna dengan impor Android '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()tidak berfungsi di iOS, harap baca jawaban saya. Tidak ada cara untuk keluar di aplikasi iOS setidaknya untuk hari ini.
CopsOnRoad
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.