Flutter

플러터의 화면이동 go_router

최데브 2025. 1. 5. 19:06

Go_Router 

 

플러터에는 화면이동을 만드는 방법이 여러가지가 있는데

기본적으로 플러터에서도 Navigator 가 있어서 라우팅에 전혀 문제는 없지만

우리는 항상 좀 더 편하게 개발을 하고 싶으니까 go_router 를 써보자.

 

실제로 많은 프로젝트에서도 채택하고 있는 듯하고

  • 템플릿 구문(예: "user/:id')을 사용하여 경로 및 쿼리 매개변수 구문 분석
  • 목적지에 대한 여러 화면 표시(하위 경로)
  • 리다이렉션 지원
  • ShellRoute를 통한 여러 Navigator 지원
  • Material 및 Cupertino 앱 모두 지원
  • Navigator API와의 하위 호환성

같은 기능들도 지원하고 있어서 화면이동을 구현하는데 있어서 부족함이 없다.

 

기본 세팅

 

패키지를 추가해주자.

dependencies:
	go_router: ^14.6.2

 

이 기능을 사용하려면 제일 먼저 

앱의 시작점에 있는 

MaterialApp 을 

@override
Widget build(BuildContext context) {
	return MaterialApp.router(
    	.. 중략
        routerConfig : router
    );
}

 

이런 식으로 바꿔줘야한다. 그리고 routerConfig 를 필수적으로 설정해줘야한다.

여기에 적혀있는 router 는 내가 작성한 라우터 파일인데 이건 아래에 적어두겠다.

생성하지 않았다면 일단 null 로 적어두자.

 

final router = GoRouter(initialLocation: "/", routes: [
  GoRoute(
    path: "/",
    builder: (context, state) => const PromotionApp(),
  ),
  GoRoute(
    path: "/mypromote",
    builder: (context, state) => const MyPromoteView(),
  ),
  GoRoute(
    path: "/promotion",
    builder: (context, state) => const PromoteView(),
  )
]);

 

대강 이런식으로 작성하게 되는데 path 에 있는 경로가 불리면 오른쪽에 선언해둔 화면으로 이동하겠다는 의미다.

실제로 이동을 호출할때는 

@override
Widget build(BuildContext context, WidgetRef ref) {
  final promotionList = ref.watch(publicPromotionListViewModelProvider);

  return Scaffold(
    body: Column(
      children: [
        Row(
          mainAxisAlignment: MainAxisAlignment.end,
          children: [
            IconButton(
              onPressed: () {
                context.go("/mypromote");
              },
              icon: const Icon(
                Icons.person,
                color: Colors.black,
                size: 30.0,
              ),
            )
          ],
        ),

 

이렇게 불러주면 이동이 되는것이다. 아주 편하다.

추가로 initialLocation 는 단어에서 보이는것처럼 라우터가 처음 시작할때 보여줄 화면을 지정할 수 있다.

아래에서 적어준 경로들중 내가 처음 띄우고 싶은 화면의 경로를 적어주면 된다.

 

전환 애니메이션

 

화면을 전환할때 애니메이션을 추가하고 싶을수도 있다.

그때는 

 

GoRoute(
	path: "/move",
	pageBuilder: (BuildContext context, GoRouterState state) => CustomTransitionPage(
          child: const FadePage(),
          transitionsBuilder: (
            BuildContext context,
            Animation<double> animation,
            Animation<double> secondaryAnimation,
            Widget child,
          ) => FadeTransition(
            opacity: animation,
            child: child,
          ),
        ),
      ),

 

CustomTransitionPage 를 이용해서 설정해줄 수 있다. 예시에서는 Fade 만 있는데 이외에도 여러 트랜지션을 제공한다.

필요에 따라서 문서를 찾아 구현해보도록 하자.

 

 

Go 와 Push 의 차이

go는 replace 의 개념이고

push 는 라우터스택에 쌓는 방식이다.

 

go로 하면 뒤로가기를 해도 뒤에 스택이 없어서 뒤로가기를 할 수 없고

push 를 사용해서 화면을 이동했다면 스택이 쌓여서 뒤로가기를 할 수 있다.

 

push 도 사용방법이 go 와 다르지 않는데 

context.push("/ascreen");

 

이렇게 써주면 되고 

 

스택을 쌓으면서 이동하다가도 현재  스택에서는 스택을 쌓는게 아니라 교체를 하고 싶다면 아래처럼 써주면 된다.

context.pushReplacement("/bscreen");

 

화면 이동할때 데이터 같이 넘기기

class Promotion {
  Promotion({required this.id, required this.user, required this.title ,required this.description});

  final String id;
  final String user;
  final String title;
  final String description;

  Promotion copyWith({String? id, String? description, bool? isCompleted}) {
    return Promotion(
      id: id ?? this.id,
      user: this.user,
      title: title,
      description: description ?? this.description,
    );
  }
}

 

대충 이런 데이터가 있다고 치자.

 

그럼 특정 라우터에서 저 값을 전달받고 싶다면 

라우터를 설정할때 

 

GoRoute(
	path: "/promotion",
	name: "promotion",
	builder: (BuildContext context, GoRouterState state) {
		return PromotionView(
               promotion: state.extra as Promotion,
            );
	}
),

 

이렇게 설정을 해주면 된다.

 

이거 외에도

 

쿼리 파마리터 넘기는 방법

콜백 처리하는 방법

리다이렉트 처리

멀티라우팅

 

등이 있는데 나머지까지 다 적으면 글이 너무 길어질거 같아서

담에 만들다가 다른걸 쓸일이 생기면 겸사겸사 적으러 와보겠다. 

귀찮아서 그런거 아님

반응형

'Flutter' 카테고리의 다른 글

플러터의 GetX ?  (0) 2023.01.08
플러터의 위젯이란?  (0) 2022.11.06
플러터란?  (0) 2022.11.06
플러터 - 토스트 메세지 만들기  (0) 2021.06.20
플러터 - 스낵바 만들기  (0) 2021.06.20