최근, 앱 개발을 진행하던 중 Dialog 제어에 대한 궁금점과 불편함을 겪었는데요,
그건 바로, 다이얼로그 외부 백그라운드를 클릭시 다이얼로그가 자동으로 꺼진다는점
그때, 이벤트 제어를 어떻게 해야할까에 대한점입니다.
아래 예제 코드와 함께 살펴보시죠.
위의 사진처럼, 확인과 취소 즉 긍정과 부정의 행동을 둘다 가진 다이얼로그의 경우엔
showDialog(
barrierDismissible: false,
context: context,
builder: (_) {
return CupertinoAlertDialog(
content:
Text('아이디와 비밀번호를 입력해 주세요.',
style: TextStyle(
fontFamily:
'NanumSquareR',
color: Color.fromRGBO(
0, 0, 0, 1),
fontSize: 14,
)),
actions: [
CupertinoDialogAction(
onPressed: () {
Navigator.of(context).pop();
},
child: Text(
'확인',
style: TextStyle(
fontFamily:
'NanumSquareR',
color: Color.fromRGBO(
16, 37, 231, 1),
fontSize: 16,
),
),
),
CupertinoDialogAction(
onPressed: () {
Navigator.of(context).pop<bool>(true);
},
child: Text(
'취소',
style: TextStyle(
fontFamily:
'NanumSquareR',
color: Color.fromRGBO(231, 26, 16, 1),
fontSize: 16,
),
),
)
],
);
});
showDialog 의 barrierDismissible attribute 값으로 제어를 하여, Background 클릭 시 다이얼로그가
자동으로 닫히지 않게 제어해줄 수 있습니다.
하지만, 여기서 우리는 취소버튼을 따로 두지 않고 사용자에게 백그라운드 클릭으로
다이얼로그를 닫을 수 있는 자유도를 뺏고 싶지 않다면 어떻게 해야 할까요?
showDialog(
context: context,
builder: (_) {
return CupertinoAlertDialog(
content:
Text('아이디와 비밀번호를 입력해 주세요.',
style: TextStyle(
fontFamily:
'NanumSquareR',
color: Color.fromRGBO(
0, 0, 0, 1),
fontSize: 14,
)),
actions: [
CupertinoDialogAction(
onPressed: () {
Navigator.of(context).pop<bool>(true);
},
child: Text(
'확인',
style: TextStyle(
fontFamily:
'NanumSquareR',
color: Color.fromRGBO(
16, 37, 231, 1),
fontSize: 16,
),
),
),
],
);
}).then((value) {
if(value == null) {
print('백그라운드 클릭함');
return;
}
if(value) {
print('확인 버튼 클릭');
} else {
print('닫기 버튼 클릭');
}
});
바로, 위와같이 해결할 수 있습니다. Navigator.of(context).pop(); 으로 다이얼로그 창을 닫아줄때
인자값을 넘김으로써 .then((arg) {}); 으로 익명함수 혹은 함수를 정의하여 처리 해줄 수 있는것이죠.
아래에선 실제 화면을 보고 마무리 하도록 하겠습니다.
테스트 결과, 백그라운드를 클릭하여 모달창을 닫았을때에 대한 이벤트 제어를 할 수 있음을 확인 할 수 있었습니다.
[Flutter]flutter_inappwebview alert 가 안 먹을때 (0) | 2023.03.07 |
---|---|
[Flutter]There are multiple heroes that share the same tag within a subtree error resolved (0) | 2023.03.02 |
[TabBarView] WebView Scroll 가능하게 하는 방법 (0) | 2023.02.15 |
[Flutter] SVG 이미지 사용하기 (0) | 2023.01.31 |
[Flutter] FCM - Push Notification (0) | 2022.12.20 |