ฉันจะปิดแอปพลิเคชัน Flutter โดยทางโปรแกรมได้อย่างไร ฉันได้ลองเปิดหน้าจอเดียว แต่ส่งผลให้หน้าจอเป็นสีดำ
ฉันจะปิดแอปพลิเคชัน Flutter โดยทางโปรแกรมได้อย่างไร ฉันได้ลองเปิดหน้าจอเดียว แต่ส่งผลให้หน้าจอเป็นสีดำ
คำตอบ:
SystemNavigator.pop()
: ไม่ทำงาน
exit(0)
: ใช้งานได้ แต่ Apple อาจระงับแอปของคุณเนื่องจากผิดหลักเกณฑ์ของ Apple Human Interface ในการออกจากแอปโดยใช้โปรแกรม
SystemNavigator.pop()
: ใช้งานได้และเป็นวิธีที่แนะนำในการออกจากแอป
exit(0)
: ใช้งานได้เช่นกัน แต่ไม่แนะนำเนื่องจากยุติกระบวนการ Dart VM ทันทีและผู้ใช้อาจคิดว่าแอปขัดข้อง
exit(0)
ตามความต้องการของคุณ
SystemNavigator.pop()
ออกจากแอพของฉันและแสดงข้อความขัดข้องexit(0)
ทำงานได้ตามที่คาดไว้
ด้านล่างทำงานได้อย่างสมบูรณ์แบบกับฉันทั้งใน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) จะให้หน้าจอว่างพร้อมแถบแถบ
คุณสามารถทำได้ด้วยSystemNavigator.pop()
.
exit(0);
ไม่ได้ผล
SystemNavigator.pop
จะถูกละเว้นเนื่องจากแนวทางการเชื่อมต่อกับมนุษย์ของ Apple ระบุว่าแอปพลิเคชันไม่ควรออกจากตัวเอง บน Android ควรใช้งานได้และเป็นที่ต้องการมากกว่าวิธีการโทรdart:io
ออก พิจารณายื่นปัญหา: github.com/flutter/flutter/issues/new
คำตอบมีให้แล้ว แต่อย่าเพิ่งคัดลอกวางลงในฐานรหัสของคุณโดยไม่รู้ว่าคุณกำลังทำอะไรอยู่:
หากคุณใช้SystemChannels.platform.invokeMethod('SystemNavigator.pop');
หมายเหตุว่าdocกล่าวถึงอย่างชัดเจน:
สั่งให้เนวิเกเตอร์ระบบลบกิจกรรมนี้ออกจากสแต็กและกลับไปที่กิจกรรมก่อนหน้า
ใน iOS การเรียกใช้วิธีนี้จะถูกละเว้นเนื่องจากแนวทางการติดต่อกับมนุษย์ของ Apple ระบุว่าแอปพลิเคชันไม่ควรออกจากตัวเอง
คุณสามารถใช้exit(0)
. และนั่นจะยุติกระบวนการ Dart VM ทันทีด้วยรหัสทางออกที่กำหนด แต่จำไว้ว่าเอกสารบอกว่า:
สิ่งนี้ไม่รอให้การดำเนินการแบบอะซิงโครนัสสิ้นสุดลง การใช้ exit จึงมีโอกาสมากที่จะสูญเสียข้อมูล
อย่างไรก็ตามเอกสารก็บันทึกไว้เช่นSystemChannels.platform.invokeMethod('SystemNavigator.pop');
กัน:
ควรใช้วิธีนี้มากกว่าการเรียก dart: วิธีการออกของ io เนื่องจากวิธีหลังอาจทำให้แพลตฟอร์มพื้นฐานทำงานราวกับว่าแอปพลิเคชันขัดข้อง
ดังนั้นอย่าลืมว่าคุณกำลังทำอะไรอยู่
ฉันชอบใช้
Future.delayed(const Duration(milliseconds: 1000), () {
SystemChannels.platform.invokeMethod('SystemNavigator.pop');
});
แม้ว่า exit (0) จะใช้งานได้ แต่แอพจะปิดทันทีและดูไม่ดีดูเหมือนว่าแอพจะขัดข้อง
Future.delayed(const Duration(milliseconds: 1000), () {
exit(0);
});
สิ่งนี้ได้ผลสำหรับฉัน
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),
),
);
}
คุณสามารถเรียกสิ่งนี้ได้โดยตรวจสอบเงื่อนไขที่ขึ้นกับแพลตฟอร์ม ดำเนินการที่แตกต่างกันเมื่อคลิกสำหรับ 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"),
)
SystemNavigator.pop()
จะไม่ทำงานภายใต้โปรแกรมจำลอง Android แอปยังทำงานอยู่เบื้องหลัง ดังนั้นฉันจึงไม่แน่ใจว่ามันจะทำงานอย่างถูกต้องบนอุปกรณ์จริงหรือไม่