[GetX] 같은 스크린, 컨트롤러가 여러개였으면 할 때

Broccolism·2021년 10월 3일
3

dev-story

목록 보기
3/9
post-thumbnail

🚨 왜 스크린 A에서 또다른 스크린 A가 추가로 안 열리지?

사용자가 쓴 글을 보여주는 PostScreen이 있다. 이 스크린 안에는 '글쓴이의 다른 글 보기'라는 곳이 있어서, 거기에 있는 글을 누르면 또다른 PostScreen이 열리면서 해당 글을 보여준다.

GetX를 사용해서 신나게 구현을 하던 중 위 시나리오에서 문제가 생겼다. Get.toNamed를 아무리 외쳐봐도 새로운 PostScreen이 생기지 않는다. 데이터를 못 불러오는건가? 엉뚱한 곳에서 호출하고 있나? 체크해봐도 아무런 문제가 없었다.

🧐 페이지 A 위에 또 페이지 A를 쌓고싶어,,,

알고보니 GetX 내부적으로 한 페이지 위에 같은 페이지를 못 쌓게 막고 있는거였다. 왜 지금까진 몰랐지? 하고 생각해보니 같은 페이지를 연속으로 쌓고 있어서 문제가 되는거였다.

그러니까 스크린 A - B - A 순서대로 쌓는건 막지 않지만
스크린 B - A - A 처럼 쌓는건 막아버린다.
앞쪽 스크린 B - A까지만 열리게 된다.

preventDuplicates 옵션 사용하기

Get.toNamed(PostScreen.route, preventDuplicates: false);

이렇게 호출하면 같은 페이지를 연속으로 스택에 쌓으려고 해도 막지 않는다. (preventDuplicates 옵션의 기본값은 true이다.)

✅✅ tag 옵션 사용하기

GetX에서 이런 동작을 막은데는 다 이유가 있었을 것이다. GetX 특성상 스크린 하나당 컨트롤러 하나를 갖게 된다. 스크린은 보여지는 UI, 컨트롤러는 그 안에서 이루어지는 로직을 갖고 있으니 당연한 일이다. 하지만 지금처럼 PostScreen 위에 또 PostScreen을 쌓아야 한다면?

우리가 원하는 동작은 서로 다른 Post의 내용을 보여주는 것이다. 그래서 나중에 쌓인 스크린에서 뒤로가기를 누르면 이전에 보고 있던 글을 보여주도록! 그리고 그 글의 내용은 컨트롤러가 갖고 있다. 그런데 PostController가 하나밖에 없다면 2가지 글 내용을 동시에 스택에 쌓을 수 없게 된다. 따라서 컨트롤러도 2개여야 한다는 결론이 난다.

같은 동작을 하는 하는 컨트롤러를 여러개 만들기 위해서는 tag 옵션을 사용한다. 아래와 같이 의존성을 주입할 때도, 컨트롤러를 찾을 때도 tag를 사용해 찾으면 된다. 태그는 String 타입의 변수면 무엇이든 사용할 수 있다.

Get.put<PostController>(tag: TAG_NAME);
Get.find<PostController>(tag: TAG_NAME);
profile
설계를 좋아합니다. 코드도 적고 그림도 그리고 글도 씁니다. 넓고 얕은 경험을 쌓고 있습니다.

0개의 댓글