Flutter[플러터] / AbsorbPointer 를 사용하여 동적으로 터치 금지하기, 막기, 제한하기 (앱솔브 포인터) AbsorbPointer (Flutter Widget of the Week)
AbsorbPointer class
히트 테스트 중 포인터를 흡수하는 위젯입니다.
absorbing 이 true일 때, 이 위젯은 자기 자신에 대한 적중 테스트를 종료하여 하위 트리에서 포인터 이벤트를 수신하지 못하도록 합니다. 레이아웃 중에도 공간을 사용하고 평소처럼 자식 위젯을 그립니다. 다만 RenderBox.hitTest 에서 true를 반환하기 때문에 자식 위젯이 위치 이벤트의 대상이 되지 않도록 합니다.
공식 문서 코드
AbsorbPointer 는 터치를 받는 위젯에게서 터치 이벤트를 받지 못하게 하는 위젯이다. 쉽게 말해 터치 기능을 빼버리는 위젯이다.
이름 그 뜻대로 포인터 이벤트를 흡수하는 기능을 가지고 있는데 이는 즉 AbsorbPointer 자체는 이벤트를 받는다는 말이다.
굉장히 유사한 위젯 중에 IgnorePointer 가 있는데 이 친구도 터치 기능을 빼버릴 때 사용하지만 진짜 말 그대로 터치 기능을 무시해 버리는 위젯이기 때문에 이 AbsorbPointer 와 기능은 비슷하지만 사용하는 곳은 완전히 다른 위젯이 되겠다.
하위 속성
속성명 | 타입 | 기본값 | 설명 |
child | Widget | – | 포인터 이벤트를 차단할 자식 위젯 |
absorbing | bool | true | 포인터 이벤트를 흡수하여 자식에게 전달되지 않도록 할지 여부 |
ignoringSemantics | bool? | null | 의미 트리 구성 시 무시할지 여부 (v3.8.0 이후 폐기됨) |
하위 속성에 ignoringSemantics 라고 있는데 이 친구는 Deprecated 되어 버려서 신경 안 써도 된다. 실질적으로 하위 속성은 두 개밖에 없다는 뜻.
AbsorbPointer 는 absorbing 으로 기능을 켜고 끌 수 있는데 이것이 이 위젯의 핵심 기능이 되겠다. 처음 이 위젯을 보면 "IgnorePointer 를 쓰면 되지 왜 이걸 써?" 하겠지만 이 기능의 유용함을 알게 되면 무릎을 탁 치게 된다.
제목에서 나와 있듯이 이 위젯은 동적인 상황에서 사용하는 위젯이다.
이 코드를 보면 바로 이해가 될 것이다.
AbsorbPointer(
absorbing: isLoading, // 로딩 중일 때만 버튼 동작 차단
child: ElevatedButton(
onPressed: () {},
child: Text("Submit"),
),
)
isLoading 의 기본값을 true 로 넣어서 만약 화면이 아직 빌드 중, 로딩 중일 때라면 터치를 못하게 막아 놓고 화면에 다 로딩이 끝나게 된다면 isLoading 을 false 로 바꿔서 다시 터치 이벤트 감지를 할 수 있게 만들어 줄 수 있는 것이다.
이렇게 AbsorbPointer 에 대해서 알아보았다. IgnorePointer 와 확실하게 구분해서 사용하도록 하고 도움이 되었길 바라며 마치겠다.