본문 바로가기
프로그래밍/Flutter

[Flutter] Navigator.push() in Dialog

by YuminK 2022. 4. 7.

예를 들어 버튼을 하나 가진 Dialog가 있을 때 OK버튼을 누르면 다른 화면으로 이동하도록 처리를 해야 한다. 이런 상황에서 보통 람다함수를 받을 수 있도록 Dialog를 설계하여 버튼을 누르는 상황에서 함수를 실행할 것이다.

 

비슷한 처리를 하던 다른 부분에서 왜 동작이 정상적으로 이루어 졌는지 확인을 해보니 Delayed 처리가 되어 있었다. 

Future.delayed(const Duration(milliseconds: 1500, ), () {
      Navigator.of(context, rootNavigator: true).pop('dialog');
	  ... 중략
	  
      Navigator.push(context, MaterialPageRoute(builder: (context) => const newScreen()));
    });

Future.delayed처리를 제외하면 다시 동작이 먹지 않기 시작하는데 도대체 이게 무슨 차이인가 해서 Dialog를 확인해보니 Dialog의 pop에 대한 처리와 람다함수에 대한 처리 순서에 대한 이슈가 있었다.

 

람다함수 -> Navigtor.of(context).pop(); (동작 안 함)

Navigator.of(context).pop(); -> 람다함수 (정상적으로 동작)

 

Dialog가 켜진 상태에서 기준으로 잡는 Navigator위치 때문에 문제가 발생하는 것으로 보이는데 안드로이드에서는 어떻게 처리가 되는지 살펴보았다.

 

다음과 같이 사용하는 함수가 있는데 람다로 함수를 받아서 OK버튼을 누르면 해당 함수를 호출해주는 처리를 하고 있다.

AppFunc.okDialog(this@MainActivity, null,
    R.string.strTest, R.drawable.ico, true
) {
    val intent = Intent(this@MainActivity, LoginActivity::class.java)
    startActivityForResult(intent, LOGIN_ACTIVITY_REQUEST)
    
}
		
okButton.setOnClickListener {
    yesListener?.invoke()
    cancel()
}

 

Android는 해당 위치를 바꿔서 돌리더라도 정상적으로 동작했다. 

Flutter는 Dialog를 먼저 없애고 이후에 람다함수를 호출해야 정상적으로 동작했다.

 

p.s. 이것도 이전에 발생한 이슈인데 따로 정리를 안 해서 또 겪었네 ㅎㅎ;

댓글