กระพือวิธีออกจากแอปโดยทางโปรแกรม


107

ฉันจะปิดแอปพลิเคชัน Flutter โดยทางโปรแกรมได้อย่างไร ฉันได้ลองเปิดหน้าจอเดียว แต่ส่งผลให้หน้าจอเป็นสีดำ

คำตอบ:


66

สำหรับ iOS

SystemNavigator.pop(): ไม่ทำงาน

exit(0): ใช้งานได้ แต่ Apple อาจระงับแอปของคุณเนื่องจากผิดหลักเกณฑ์ของ Apple Human Interface ในการออกจากแอปโดยใช้โปรแกรม


สำหรับ Android

SystemNavigator.pop(): ใช้งานได้และเป็นวิธีที่แนะนำในการออกจากแอป

exit(0): ใช้งานได้เช่นกัน แต่ไม่แนะนำเนื่องจากยุติกระบวนการ Dart VM ทันทีและผู้ใช้อาจคิดว่าแอปขัดข้อง


1
ดูเหมือนว่าSystemNavigator.pop()จะไม่ทำงานภายใต้โปรแกรมจำลอง Android แอปยังทำงานอยู่เบื้องหลัง ดังนั้นฉันจึงไม่แน่ใจว่ามันจะทำงานอย่างถูกต้องบนอุปกรณ์จริงหรือไม่
BambinoUA

2
@AleksTi มันออกจากแอพไม่ได้ปิดกระบวนการ VM คุณอาจลองexit(0)ตามความต้องการของคุณ
CopsOnRoad

SystemNavigator.pop()ออกจากแอพของฉันและแสดงข้อความขัดข้องexit(0)ทำงานได้ตามที่คาดไว้
Shanks

147

ด้านล่างทำงานได้อย่างสมบูรณ์แบบกับฉันทั้งใน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 ห้ามไม่ให้มีปุ่มออกที่กำหนดเองและอาจปฏิเสธแอปหากคุณมี
Dima Rostopira

@HasanAYousef ในโซลูชันของฉันรับข้อความไม่ได้กำหนดชื่อ SystemChannels
user_odoo

38

คุณสามารถทำได้ด้วยSystemNavigator.pop().


1
ไม่มีอะไรเกิดขึ้นทั้งบน Android และ iOS ใช้exit(0);ไม่ได้ผล
Theo Bouwman

2
ใน iOS SystemNavigator.popจะถูกละเว้นเนื่องจากแนวทางการเชื่อมต่อกับมนุษย์ของ Apple ระบุว่าแอปพลิเคชันไม่ควรออกจากตัวเอง บน Android ควรใช้งานได้และเป็นที่ต้องการมากกว่าวิธีการโทรdart:ioออก พิจารณายื่นปัญหา: github.com/flutter/flutter/issues/new
Collin Jackson

มีความคิดสำหรับ iOS เราจะทำอย่างไรในการกระพือปีก?
iPatel

@iPatel คุณสามารถใช้ exit (0) สำหรับ iOS ได้เลย
CopsOnRoad

แต่สิ่งที่เกี่ยวกับการปฏิเสธ (ตามที่คุณบอกในความคิดเห็นด้านบน
iPatel

32

คำตอบมีให้แล้ว แต่อย่าเพิ่งคัดลอกวางลงในฐานรหัสของคุณโดยไม่รู้ว่าคุณกำลังทำอะไรอยู่:

หากคุณใช้SystemChannels.platform.invokeMethod('SystemNavigator.pop');หมายเหตุว่าdocกล่าวถึงอย่างชัดเจน:

สั่งให้เนวิเกเตอร์ระบบลบกิจกรรมนี้ออกจากสแต็กและกลับไปที่กิจกรรมก่อนหน้า

ใน iOS การเรียกใช้วิธีนี้จะถูกละเว้นเนื่องจากแนวทางการติดต่อกับมนุษย์ของ Apple ระบุว่าแอปพลิเคชันไม่ควรออกจากตัวเอง

คุณสามารถใช้exit(0). และนั่นจะยุติกระบวนการ Dart VM ทันทีด้วยรหัสทางออกที่กำหนด แต่จำไว้ว่าเอกสารบอกว่า:

สิ่งนี้ไม่รอให้การดำเนินการแบบอะซิงโครนัสสิ้นสุดลง การใช้ exit จึงมีโอกาสมากที่จะสูญเสียข้อมูล

อย่างไรก็ตามเอกสารก็บันทึกไว้เช่นSystemChannels.platform.invokeMethod('SystemNavigator.pop');กัน:

ควรใช้วิธีนี้มากกว่าการเรียก dart: วิธีการออกของ io เนื่องจากวิธีหลังอาจทำให้แพลตฟอร์มพื้นฐานทำงานราวกับว่าแอปพลิเคชันขัดข้อง

ดังนั้นอย่าลืมว่าคุณกำลังทำอะไรอยู่


12
คุณเขียนบันทึกที่ชาญฉลาดมากมาย แต่ ... วิธีที่ถูกต้องในการออกจากแอปโดยทางโปรแกรมโดยไม่มีการระงับที่เป็นไปได้ใน iOS ตามที่อธิบายไว้ด้านล่างคืออะไร?
BambinoUA

6

ฉันชอบใช้

 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

    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"),
            )
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.