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

djum0602님의 프로필 이미지
djum0602

작성한 질문수

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

GoNamed 함수

context.go 가 실행이 안될때

작성

·

323

0

안녕하세요.

GoRouter 이론 부분을 듣다가 context.go('/one'); 가

실행이 되지 않고 버튼을 누르면 먹통입니다.

context.push('/one'); 는 작동을 합니다..

  • 설치버전은 4.2.2

  • 처음에 최신버전을 사용했다가 이전 문의글들 참고해서 4.2.2로 다시 설치했습니다. 이후에 flutter clean , put get, restart 도 했어요

어떤 부분을 확인해야 할까요? 도와주세요...

 

소스코드 ------

cupertino_icons: ^1.0.2
go_router: ^4.2.2

 

main.dart

import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:go_router_actual/screen/1_screen.dart';
import 'package:go_router_actual/screen/2_screen.dart';
import 'package:go_router_actual/screen/3_screen.dart';
import 'package:go_router_actual/screen/home_screen.dart';

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

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

  GoRouter get _router => GoRouter(
    initialLocation: '/',   // 앱을 처음 시작했을 때 보여주는 화면
    // routes - 모든 스크린 정의
    routes: [
      GoRoute(
        path: '/',
        builder: (_, state) => HomeScreen(),
        routes: [
          GoRoute(
            path: 'one',
            builder: (_, state) => OneScreen(),
          ),
        ],
      ),
    ],
  );

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

 

HomeScreen.dart

import 'package:flutter/material.dart';
import 'package:go_router/go_router.dart';
import 'package:go_router_actual/layout/default_layout.dart';

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

  @override
  Widget build(BuildContext context) {
    return DefaultLayout(
      body: Column(
        crossAxisAlignment: CrossAxisAlignment.stretch,
        children: [
          ElevatedButton(
            onPressed: () {
              context.go('/one');
            },
            child: Text(
              'Screen One (Go)',
            ),
          ),
        ],
      ),
    );
  }
}

답변 2

0

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

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

  @override
  Widget build(BuildContext context) {
    final GoRouter _router = GoRouter(
      initialLocation: '/',
      routes: [
        GoRoute(
          path: '/',
          builder: (_, state) => const HomeScreen(),
          routes: [
            GoRoute(
              path: 'one',
              builder: (_, state) => const OneScreen(),
              routes: [
                GoRoute(
                  path: 'two',
                  builder: (_, state) => const TwoScreen(),
                  routes: [
                    GoRoute(
                      path: 'three',
                      builder: (_, state) => const ThreeScreen(),
                    ),
                  ],
                ),
              ],
            ),
          ],
        ),
      ],
    );

    return MaterialApp.router(
      routeInformationProvider: _router.routeInformationProvider,
      routeInformationParser: _router.routeInformationParser,
      routerDelegate: _router.routerDelegate,
    );
  }
}

늦었지만 저도 동일한 문제를 겪어서 답글 남겨요. 아래 답글주신것도 해보았지만 동일하게 안되었고, 되는방법은 찾았는데 왜 되는지는 모르겠어요.

해결 방법은

패키지는 4.2.2 이고, _router를 build 안에다가 정의하면 잘 작동합니다. (위 코드 참고)

대신 안되는 부분이 있는데 go('three') 에서 뒤로 돌아올 때, 화면은 3>2>1 로 순서대로 잘 빠져나오는데, defaultLayout에서 보여주는 title: router.location은 변경이 되지않고 one/two/three 그대로 나옵니다.

감사합니다.

0

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

안녕하세요!

GoRouter 최신 버전이 go() 함수가 실행이 잘 안될때가 있습니다.

제 생각에는 현재 최신 버전이 캐싱되어서 최신 버전 GoRouter가 계속 사용되는 것 같습니다.

flutter clean을 실행해서 완전 제거 해주시고 GoRouter 버전을 "^" <- 캐럿 없이 강제지정해보세요.

그래도 안되면 저희 커뮤니티에서 원격 잡아주세요!

감사합니다!

djum0602님의 프로필 이미지
djum0602

작성한 질문수

질문하기