어떻게 프로그래밍 방식으로 Flutter 애플리케이션을 닫을 수 있습니까? 나는 유일한 화면을 터뜨 리려고 시도했지만 그 결과 검은 화면이 나타납니다.
답변:
SystemNavigator.pop()
: 작동 하지 않음
exit(0)
: 작동하지만 프로그래밍 방식으로 앱을 종료하는 것은 Apple 휴먼 인터페이스 지침에 위배되므로 Apple은 앱을 일시 중단 할 수 있습니다 .
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 년 1 월 업데이트 선호하는 솔루션은 다음과 같습니다.
SystemChannels.platform.invokeMethod('SystemNavigator.pop');
여기에 설명 된대로
t work for me... I
m은 CupertinoTabScafold에 종료 버튼을 추가하려고합니다. () => exit (0)을 사용하면 탭 바가있는 빈 화면이 나타납니다.
이 작업은 SystemNavigator.pop()
.
exit(0);
하지 작업
SystemNavigator.pop
Apple의 휴먼 인터페이스 지침에 애플리케이션이 스스로 종료해서는 안된다고 명시되어 있기 때문에이 무시됩니다. Android에서는 작동해야하며 dart:io
의 exit 메서드 를 호출하는 것보다 선호 됩니다. 문제를 제기 고려해 github.com/flutter/flutter/issues/new
답변은 이미 제공되었지만 수행중인 작업을 모르고 코드베이스에 복사하여 붙여 넣지 마십시오.
사용 SystemChannels.platform.invokeMethod('SystemNavigator.pop');
하는 경우 문서에서 다음 을 명확하게 언급합니다.
스택에서이 활동을 제거하고 이전 활동으로 돌아가도록 시스템 탐색기에 지시합니다.
iOS에서는 Apple의 휴먼 인터페이스 지침에 애플리케이션이 스스로 종료해서는 안된다고 명시되어 있으므로이 메서드에 대한 호출은 무시됩니다.
사용할 수 있습니다 exit(0)
. 그러면 주어진 종료 코드로 Dart VM 프로세스가 즉시 종료됩니다. 그러나 그 문서 는 다음과 같이 말합니다.
비동기 작업이 종료 될 때까지 기다리지 않습니다. 따라서 exit를 사용하면 데이터가 손실 될 가능성이 높습니다.
어쨌든 문서 는 다음과 같이 메모했습니다 SystemChannels.platform.invokeMethod('SystemNavigator.pop');
.
이 메서드는 dart : io의 exit 메서드를 호출하는 것보다 선호되어야합니다. 후자는 애플리케이션이 충돌 한 것처럼 기본 플랫폼이 작동하도록 할 수 있기 때문입니다.
그래서 당신이하는 일을 기억하십시오.
나는 사용하는 것을 선호한다
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 에뮬레이터에서 작동하지 않는 것 같습니다 . 앱은 여전히 백그라운드에서 작동합니다. 따라서 실제 장치에서 제대로 작동하는지 확실하지 않습니다.