Rung động cách thoát ứng dụng theo chương trình


102

Làm cách nào để đóng ứng dụng Flutter theo chương trình. Tôi đã thử bật màn hình duy nhất nhưng điều đó dẫn đến màn hình đen.

Câu trả lời:


57

Đối với iOS

SystemNavigator.pop(): KHÔNG HOẠT ĐỘNG

exit(0): Hoạt động nhưng Apple có thể TẠM NGỪNG ỨNG DỤNG CỦA BẠN vì nó chống lại các nguyên tắc về Giao diện Con người của Apple để thoát ứng dụng theo chương trình.


Đối với Android

SystemNavigator.pop(): Hoạt động và là cách ĐƯỢC KHUYÊN DÙNG để thoát ứng dụng.

exit(0): Cũng hoạt động nhưng nó KHÔNG ĐƯỢC KHUYẾN CÁO vì nó chấm dứt quá trình Dart VM ngay lập tức và người dùng có thể nghĩ rằng ứng dụng vừa gặp sự cố.


1
Có vẻ như SystemNavigator.pop()không hoạt động trong trình giả lập Android. Ứng dụng vẫn đang hoạt động trong nền. Vì vậy, tôi không chắc liệu nó có hoạt động bình thường trên thiết bị thực hay không.
BambinoUA

2
@AleksTi Nó chỉ đơn giản là thoát khỏi ứng dụng, nó không đóng quá trình VM. Bạn có thể thử exit(0)cho nhu cầu của bạn.
CopsOnRoad vào

SystemNavigator.pop()thoát khỏi ứng dụng của tôi và hiển thị thông báo về sự cố, exit(0)hoạt động như mong đợi
Shanks

138

Dưới đây hoạt động hoàn hảo với tôi trong cả hai AndroidiOS, tôi đã sử dụng exit(0)từ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),
          ), 
    );
  }

CẬP NHẬT Tháng 1 năm 2019 Giải pháp ưa thích là:

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

Như mô tả ở đây


Tôi đã không t work for me... Icố gắng thêm nút thoát vào CupertinoTabScafold. Với () => exit (0), nó đưa ra một màn hình trống với tabbar.
Ricardo BRGWeb

3
Nó hoạt động. Tuy nhiên, Apple cấm nút exit tùy chỉnh và có lẽ sẽ từ chối ứng dụng nếu bạn có một
Dima Rostopira

@HasanAYousef Trong giải pháp get nhắn Undefined SystemChannels tên tôi
user_odoo

36

Bạn có thể làm điều này với SystemNavigator.pop().


1
Không có gì xảy ra trên cả Android và iOS. Sử dụng exit(0);làm việc
Theo Bouwman

2
Trên iOS, SystemNavigator.popbị bỏ qua vì hướng dẫn giao diện người của Apple nêu rõ rằng các ứng dụng không được tự thoát ra. Trên Android, nó sẽ hoạt động và được ưu tiên hơn là gọi dart:iophương thức thoát. Cân nhắc nộp một vấn đề: github.com/flutter/flutter/issues/new
Collin Jackson

Bất kỳ ý tưởng nào cho iOS, làm thế nào chúng ta có thể thực hiện trong bối cảnh?
iPatel

@iPatel Bạn có thể sử dụng exit (0) cho iOS, vậy là xong.
CopsOnRoad vào

Yo nhưng bị từ chối thì sao; (như bạn đã nói trong nhận xét ở trên
iPatel

31

Các câu trả lời đã được cung cấp nhưng vui lòng không chỉ sao chép, dán những câu đó vào cơ sở mã của bạn mà không biết bạn đang làm gì:

Nếu bạn sử dụng SystemChannels.platform.invokeMethod('SystemNavigator.pop');lưu ý rằng tài liệu đang đề cập rõ ràng:

Hướng dẫn trình điều hướng hệ thống xóa hoạt động này khỏi ngăn xếp và quay lại hoạt động trước đó.

Trên iOS, các lệnh gọi đến phương thức này bị bỏ qua vì hướng dẫn giao diện người của Apple nêu rõ rằng các ứng dụng không được tự thoát ra.

Bạn có thể sử dụng exit(0). Và điều đó sẽ kết thúc quá trình Dart VM ngay lập tức với mã thoát đã cho. Nhưng hãy nhớ rằng tài liệu nói:

Điều này không đợi bất kỳ hoạt động không đồng bộ nào kết thúc. Sử dụng exit do đó rất dễ bị mất dữ liệu.

Dù sao bác cũng đã lưu ý SystemChannels.platform.invokeMethod('SystemNavigator.pop');:

Phương thức này nên được ưu tiên hơn là gọi phương thức thoát của dart: io, vì phương thức này có thể khiến nền tảng bên dưới hoạt động như thể ứng dụng đã bị lỗi.

Vì vậy, hãy ghi nhớ những gì bạn đang làm.


10
Bạn đã viết rất nhiều ghi chú thông minh nhưng ... đâu là cách chính xác để thoát khỏi ứng dụng theo chương trình mà không có khả năng bị tạm dừng trong iOS như mô tả bên dưới?
BambinoUA

4

Tôi thích sử dụng hơn

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

Mặc dù, exit (0) cũng hoạt động nhưng ứng dụng đóng đột ngột và trông không đẹp mắt, có vẻ như ứng dụng đã bị lỗi.

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

2

Điều này đã làm việc cho tôi;

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

Dưới đây hoạt động hoàn hảo với tôi trong cả Android và iOS nhập '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()không hoạt động trong iOS, vui lòng đọc câu trả lời của tôi. Không có cách nào để thoát khỏi ứng dụng iOS ít nhất là cho đến hôm nay.
CopsOnRoad
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.