사용자가 쓴 글을 보여주는 PostScreen이 있다. 이 스크린 안에는 '글쓴이의 다른 글 보기'라는 곳이 있어서, 거기에 있는 글을 누르면 또다른 PostScreen이 열리면서 해당 글을 보여준다.
GetX를 사용해서 신나게 구현을 하던 중 위 시나리오에서 문제가 생겼다. Get.toNamed
를 아무리 외쳐봐도 새로운 PostScreen이 생기지 않는다. 데이터를 못 불러오는건가? 엉뚱한 곳에서 호출하고 있나? 체크해봐도 아무런 문제가 없었다.
알고보니 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);