예전에는 잘 사용하던 WillPopScope
플러터(Flutter)를 개발하다 보면, 보통 iOS, Android 두 플랫폼을 대상으로 개발을 한다.
iOS는 뒤로가기 라는게 없고, 바로 홈으로 돌아가지만,
안드로이드의 경우 물리(또는 소프트 버튼)을 통해서 뒤로 가기를 할 수 있다.
이런 조작을 보통 네비게이션 조작으로 보는데 WillPopScope의 경우 네비게이션 조작을 돕는 기능이라 할 수 있다.
보통 맨 최 상위 위젯에 아래와 같이 보통 작성한다.
return WillPopScope(
onWillPop: () {
return _onBackKey();
},
child: Scaffold()
);
근데 저 코드를 사용하면 아래와 같은 경고가 뜬다.
'WillPopScope.new' is deprecated and shouldn't be used. Use PopScope instead. This feature was deprecated after v3.12.0-1.0.pre.
3.12.0-1 부터 Deprecated 되니 대안으로 PopScope를 사용하라고 한다.
왜 사라짐?
이건 안드로이드가 올라가면서 안드로이드 14 (API 34)부터 Predictive Back Feature라는게 도입되고,
이에 따라 기존에 플러터에서 사용하던 WillPopScope의 경우 호환되지 않아 Deprecated 된다고 한다.
// Copyright 2014 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
주석만 봐도 14년에 만들어서 잘 사용하던 건데 아무래도 재개발 하는게 더 싸게 먹힌 것 같다.
Predictive Back Feature?
간단히 설명하자면 뒤로 가기 제스쳐를 할 때 뒤에 있던(또는 현재 화면 이전에 있던) 화면을 미리 보여주는 기능이다.
그냥 iOS에서 스와이프 하면 보이는 기능이랑 유사한 거라 보면 된다.
궁금한 분은 구글의 공식 유튜브를 참고하자.
PopScope
얘는 24년에 나온 따끈따끈한 API다.
// Copyright 2014 The Flutter Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
PopScope도 당연히 위젯인데 대략 아래와 같다.
class PopScope extends StatefulWidget {
/// Creates a widget that registers a callback to veto attempts by the user to
/// dismiss the enclosing [ModalRoute].
const PopScope({
super.key,
required this.child,
this.canPop = true,
this.onPopInvoked,
});
....
}
child의 경우 당연히 필요한 위젯이고, canPop과 onPopInvoked 두 가지가 있는데 어렵지 않다.
canPop
말 그대로 뒤로 넘어갈 수 있는지 여부를 나타내는 파라메타다.
기본 값은 true로 되어 있지만, 사용자가 특정 이벤트에 뒤로 가기를 막아야 할 경우 false를 주면 된다.
보통 로딩 같은 곳에서 많이 사용한다.
return PopScope(
canPop: !loadingProvider.isLoading,
onPopInvoked: (bool isPop) {
///
},
child: Stack(
children: [
],
),
);
동적으로 로딩 중일 때는 뒤로 가기를 막고,
로딩이 끝나면 이동하게끔 해줄 수 있다.
onPopInvoked
이 메서드는 뒤로 가기가 동작했을 때 호출되는 콜백 메서드다.
참고로 canPop에 값이 false던 true던 무조건 호출된다.
onPopInvoked: (bool isPop) {
///
},
저 isPop의 전달 값이 뒤로 가기 동작에 대한 결과를 가진다.
true면 성공, false면 실패로 된다.
정리
뭐 복잡할 줄 알았는데 간단하다.
사실 내가 풀어서 쓴 것 보다 공식 문서를 보면 더 쉽다. -_-;;