네이게이션 컴폰넌트를 사용하시면 1, 4번은 사용하시면 안됩니다. 모든 걸 NavController에게 위임하셔야 해요. 님이 임의대로 트랜지션을 만들거나 님의 정의한 방법대로 값을 넘기는 것은 님이 알 수 없는 에러를 만드는 원인이 되요. 제 경험상, 적어도 네비게이션 컴포넌트는 그럴 소지가 아주 커요.
그리고 사용법은 아주 간단합니다.
Bundle myBundle = getMyBundle();
navController.navigate(R.id.next_fragment, null , myBundle);
|
그리고 받는 쪽에서는 님이 했던 방식으로 argument에서 값을 읽어오면 됩니다.
한가지 제안을 드리자면, 님이 OOP의 추상화라는 개념을 이애하시고 좋아하신다면, 바로 네이게이션 컴포넌트를 사용하지 마시고 랩퍼 클래스로 감싸서 사용하세요. 앱에서 네이게이션 컴포넌트를 많이 사용할 수록 네이게이션 컴포넌트를 바로 사용하는 경우 네게이션이 어디로 흘러가는지도 통제가 어렵고 코드도 금방 지저분해져요.
public interface HomeFlow {
public void start();
public void showMovie();
public void showMovieDetails(Movie movie);
}
public class HomeFlowImpl implements HomeFlow {
private Navigator navigator;
public HomeFlowImpl(Navigator navigator) {
this .Navigator = navigator;
}
@Override
public void start() {
navigator.goTo(...);
}
@Override
public void showMovie() {
navigator.goTo(...);
}
@Override
public void showMovieDetails(Movie movie) {
navigator.goTo(...);
}
}
public interface Navigator {
public void goTo(NavParam param) {
}
}
public class NavigatorImpl impements Navigator {
private NavController navController;
public NavigatorImpl(NavController navController) {
this .navController = navController;
}
@Override
public void goTo(NavParam param) {
navController.navigate(param.toNavOptions());
}
}
|
아이디어는 간단합니다. 그냥 인터페이스와 구현 클래스를 만들고 그걸로 NavController를 감싸서 사용하는 겁니다. 그리고 화면마다 Flow라는 클래스를 만들어서 그 화면과 관련된 네이게이션을 이 녀석이 관리하는 겁니다.
이게 그냥 네비게이션 컴폰넌트를 바로 사용하는 것보다는 몇 배는 좋은 구조라고 생각합니다. 한가지 예로, 화면 전환시 로그인 체크를 해야한다면, 간단히 NaviatorImpl 안에서 로그인이 안되었다면, 로그인 화면으로 이동하게 하면 됩니다. 그리고 최초 사용자 앱이용시 온보딩 화면들이 보여야 한다면 Flow 안에서 사용자 상태를 체크하여 OnBoardFlow로 가게 하거나 LoginFlow로 가게 만들 수 있겠죠.