프로그래밍 방식으로 앱을 종료하는 방법을 Flutter


107

어떻게 프로그래밍 방식으로 Flutter 애플리케이션을 닫을 수 있습니까? 나는 유일한 화면을 터뜨 리려고 시도했지만 그 결과 검은 화면이 나타납니다.

답변:


66

iOS 용

SystemNavigator.pop(): 작동 하지 않음

exit(0): 작동하지만 프로그래밍 방식으로 앱을 종료하는 것은 Apple 휴먼 인터페이스 지침에 위배되므로 Apple은 앱을 일시 중단 할 수 있습니다 .


Android 용

SystemNavigator.pop(): 작동하며 앱을 종료하는 권장 방법입니다.

exit(0): 또한 작동하지만 Dart VM 프로세스를 즉시 종료하고 사용자가 앱이 방금 충돌했다고 생각할 수 있으므로 권장하지 않습니다 .


1
SystemNavigator.pop()Android 에뮬레이터에서 작동하지 않는 것 같습니다 . 앱은 여전히 ​​백그라운드에서 작동합니다. 따라서 실제 장치에서 제대로 작동하는지 확실하지 않습니다.
BambinoUA

2
@AleksTi 단순히 앱을 종료하고 VM 프로세스를 종료하지 않습니다. 당신은 exit(0)당신의 필요를 위해 시도 할 수 있습니다.
CopsOnRoad

SystemNavigator.pop()내 응용 프로그램과 쇼 충돌의 메시지를 종료가 exit(0)예상대로 작동
정강이

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 년 1 월 업데이트 선호하는 솔루션은 다음과 같습니다.

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

여기에 설명 된대로


didn를한다는 t work for me... Im은 CupertinoTabScafold에 종료 버튼을 추가하려고합니다. () => exit (0)을 사용하면 탭 바가있는 빈 화면이 나타납니다.
Ricardo BRGWeb

3
효과가있다. 그러나 애플은 사용자 정의 종료 버튼을 금지하고있는 경우 아마도 응용 프로그램을 거부 한
디마 Rostopira

내 솔루션 가져 오기 메시지 정의되지 않은 이름 SystemChannels에서 @HasanAYousef
user_odoo

38

이 작업은 SystemNavigator.pop().


1
Android와 iOS 모두에서 아무 일도 일어나지 않습니다. 사용 exit(0);하지 작업
테오 Bouwman

2
iOS에서는 SystemNavigator.popApple의 휴먼 인터페이스 지침에 애플리케이션이 스스로 종료해서는 안된다고 명시되어 있기 때문에이 무시됩니다. Android에서는 작동해야하며 dart:io의 exit 메서드 를 호출하는 것보다 선호 됩니다. 문제를 제기 고려해 github.com/flutter/flutter/issues/new
콜린 잭슨에게

iOS에 대한 아이디어가 있습니까?
iPatel

@iPatel iOS의 경우 exit (0)을 사용할 수 있습니다.
CopsOnRoad

요하지만 거부에 대한 어떤 (위 코멘트에 말했듯이
iPatel

32

답변은 이미 제공되었지만 수행중인 작업을 모르고 코드베이스에 복사하여 붙여 넣지 마십시오.

사용 SystemChannels.platform.invokeMethod('SystemNavigator.pop');하는 경우 문서에서 다음 을 명확하게 언급합니다.

스택에서이 활동을 제거하고 이전 활동으로 돌아가도록 시스템 탐색기에 지시합니다.

iOS에서는 Apple의 휴먼 인터페이스 지침에 애플리케이션이 스스로 종료해서는 안된다고 명시되어 있으므로이 메서드에 대한 호출은 무시됩니다.

사용할 수 있습니다 exit(0). 그러면 주어진 종료 코드로 Dart VM 프로세스가 즉시 종료됩니다. 그러나 그 문서 는 다음과 같이 말합니다.

비동기 작업이 종료 될 때까지 기다리지 않습니다. 따라서 exit를 사용하면 데이터가 손실 될 가능성이 높습니다.

어쨌든 문서 는 다음과 같이 메모했습니다 SystemChannels.platform.invokeMethod('SystemNavigator.pop');.

이 메서드는 dart : io의 exit 메서드를 호출하는 것보다 선호되어야합니다. 후자는 애플리케이션이 충돌 한 것처럼 기본 플랫폼이 작동하도록 할 수 있기 때문입니다.

그래서 당신이하는 일을 기억하십시오.


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.