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

신재우님의 프로필 이미지

작성한 질문수

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

GoRouter 질문

작성

·

926

1

안녕하세요 flutter 강의를 듣고 있는 수강생입니다. 섹션12에 프로젝트 세팅하기, GoRouter 세팅하기, Go 함수 이렇게 3개의 강의를 그대로 따라하고 있습니다. 그런데 context.go() 함수가 실행이 되지 않습니다. 에러 메시지가 따로 뜨지는 않는데 혹시 강사님께서는 현재도 실행이 잘 되시나요? go_router 버전은 4.2.2로 강의와 동일하게 맞춰주었고 flutter 버전은 3.0.5입니다. 감사합니다.

답변 6

2

신재우님의 프로필 이미지
신재우
질문자

go router 5.0.5 기준 MaterialApp.router(routerConfig:_router) 를 적용하여 해결했습니다! 이 경우에는 routeInformationProvider, routeInformationParser, routerDelegate를 할당할 필요가 없는 것 같습니다.

1

저도 ErrorScreen 까지 구현하면서 go가 실행되지 않는 문제를 겪었습니다.

그런데 _router 선언 부분을 수정하니 정상적으로 go 가 실행되네요.

아래 강사님 답변처럼 재시작도 해주시기 바래요.

 


void main() {
  runApp(const _App());
}

// _router 를 다음과 같이 처리하였습니다.
final _router = GoRouter(
  initialLocation: '/',
  errorBuilder: (context, state) {
    return ErrorScreen(error: state.error.toString());
  },
  routes: [
    GoRoute(
      path: '/',
      builder: (context, state) => HomeScreen(),
      routes: [
        GoRoute(
          name: 'one',
          path: 'one',
          builder: (context, state) => OneScreen(),
          routes: [
            GoRoute(
              name: 'two',
              path: 'two',
              builder: (context, state) => TwoScreen(),
              routes: [
                GoRoute(
                  name: ThreeScreen.routename,
                  path: 'three',
                  builder: (context, state) => ThreeScreen(),
                ),
              ],
            ),
          ],
        ),
      ],
    ),
  ],
);

class _App extends StatelessWidget {
  const _App({Key? key}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp.router(
      // routerConfig: _router,
      debugShowCheckedModeBanner: false,
      routeInformationProvider: _router.routeInformationProvider,
      routeInformationParser: _router.routeInformationParser,
      routerDelegate: _router.routerDelegate,
    );
  }
}

 

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

확인 감사합니다!

아따 감사합니다. 한참 헤맸습니다.

0

.go가 실행 안 되는 문제 때문에 시간을 좀 보냈네요.

onscommunicationdev 님 댓글을 보고 확인했습니다.

'GoRouter 세팅하기' 강의 따라서 코드 작성하다 4분 32초 시점에,

GoRouter get _router => GoRouter(...

이렇게 구현되어 있었는데, 에러 터지고 편집 시점이 옮겨지면서 코드가 다음과 같이 변경(5분 21초쯤 확인 가능)됩니다.

final GoRouter _router = GoRouter(...

이제 .go가 제대로 작동하군요.

제 버전은 ^5.2.4구요. 도움되시길 바랍니다 :)

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

안녕하세요.

아무래도 신규버전 구현 방식이 변경된 것 같군요.

확인 후 수정조치 하도록 하겠습니다.

감사합니다!

0

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

안녕하세요!

go가 실행되지 않는 경우는 라우트가 등록되지 않은 경우밖에 없는 것 같습니다.

라우트 등록은 Hot Reload로 반영할 수 있는 사항이 아니라 꼭 재시작을 해줘야합니다.

이부분 참고해서 추후 에러가 있을때 반영해보세요!

0

신재우님의 프로필 이미지
신재우
질문자

context.push()는 동작해서 context.go() 대신에 context.push()를 사용하려고 하는데 프로젝트 진행에 문제가 없을까요?

별개로 궁금한 점이 있는데, context.go()는 context.push()와 달리 화면이 스택처럼 쌓이는 것이 아니라 그냥 말 그대로 이동이라고 보면 될까요? context.push() 가 Navigator.push()와 사실상 동일하고 context.go()가 Navigator.pushAndRemoveUntil()과 같다고 봐도 되는 지 궁금합니다.

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

안녕하세요!

작동 방식의 약간의 차이는 있습니다. 예를들어서 go() 함수를 사용할경우 하위 모든 라우트가 푸쉬되고 지정된 Stack이 네비게이션 스택으로 쌓이게되는데

push() 함수의 경우 최근 라우트에 할당한 새로운 라우트를 올리는 작업만 진행합니다.

0

신재우님의 프로필 이미지
신재우
질문자

flutter upgrade --force 를 실행하여 flutter 버전을 업그레이드 해주고 go_router 최신 버전인 5.0.5로 실행하여도 동일하게 context.go() 함수만 실행이 되지 않습니다.

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

안녕하세요.

go_router 버전을 영상과 똑같은 버전을 꼭 사용해주세요!

업데이트된 부분은 추후 반영될 예정입니다!