인프런 커뮤니티 질문&답변

park12님의 프로필 이미지
park12

작성한 질문수

[코드팩토리] [중급] Flutter 진짜 실전! 상태관리, 캐시관리, Code Generation, GoRouter, 인증로직 등 중수가 되기 위한 필수 스킬들!

Gorouter 사용에 질문이 있습니다.

작성

·

934

0

안녕하세요 먼저 강의는 잘보고있습니다.

Gorouter에 대해 다시 정리하는 도중 하나 궁금한게 생겨서 질문드립니다.

이론에서 사용하셨던 프로젝트 기준으로

만약 이런식으로

context.go('/one');

Home -> one로 이동한다고 가정했을때

 

Home에 print build

One에 print build를 해두면

 

flutter: One Screen build

flutter: HomeScreen didChangeDependencies

flutter: HomeScreen build

이렇게 찍히더라구요

(Home은 ful위젯으로 바꿔서 찍어봤습니다)

 

제가 의문인건 Home -> One 이동하는건데

왜 Home이 다시 빌드가 되며, 이는 메모리 낭비라고 생각하는데

다른 대안이나 원래 구조상 이렇게 짜여져있는건가요?

 

기존방식이었던

Navigator.of(context).push(
  MaterialPageRoute(builder: (_) => OneScreen())
);

이런식으로 이동을 한다면 기존스택은 남아

제가 원하는 대로 flutter: One Screen build만 찍히는데,

 

감사합니다.

 

 

답변 1

1

코드팩토리님의 프로필 이미지
코드팩토리
지식공유자

안녕하세요!

기본적으로 go와 push는 매우 다르게 작동합니다. 강의에서도 설명드렸지만 go()는 현재 라우트 스택이 어떻게 돼있든 저의가 선언해둔대로 라우트를 올리는 역할을 합니다.

반면에 push는 현재 스택에 하나의 페이지만 올리는 역할을 하기때문에 말씀하신 방식으로 작동하는걸로 보입니다.

렌더링때문에 비효율적으로 느껴질 수도 있지만 이러한 이유때문에 장점도 명확합니다.

선언형으로 라우팅을 다룰 수 있다는 편리함이 있으며 dynamic link 같은 기능을 사용할때 모든 라우팅 로직을 작성할 필요 없이 선언돼있는 라우트로 go()를 한번 실행하면 하위라우트가 모두 같이 푸쉬 됩니다.

감사합니다!

park12님의 프로필 이미지
park12
질문자

답변감사합니다!

안녕하세요 코드팩토리님 저도 비슷한 질문이 있어 여기에 글 남겨봅니다.
context.go / context.push 둘다 사용시 이전 페이지에서 빌드가 일어나게 되는데 다른 해결책은 없고 이때만 navigator.push 사용하는게 유일한 대안 방법일까요..?

코드팩토리님의 프로필 이미지
코드팩토리
지식공유자

안녕하세요!

go router를 사용할때 build()가 지속적으로 이뤄지는건 아쉬운 부분이긴 하나 애초에 flutter 프레임워크가 build() 횟수에 상관없이 퍼포먼스가 잘 나오도록 설계돼있습니다. 공식 다큐멘테이션의 어디에있던 내용인지 정확히 기억은 안나는데 분명 공식 문서에 있습니다. 그리고 대부분의 플러터가 지향하는 형태와 비슷한 SPA들이 같은 모습을 띄고 있습니다.

그렇기때문에 비정상적으로 build()가 많이 실행되계 설계가 된게 아닌이상, navigation 이동간에 한번 더 실행되는 정도는 문제가 없어야하는건 맞습니다.

만약에 크게 불편하시다면 Navigator의 push 기능을 사용하시는게 맞을 것 같습니다!

감사합니다!

park12님의 프로필 이미지
park12

작성한 질문수

질문하기