티스토리 뷰
대부분의 앱은 다양한 정보를 표시하기 위해 여러 화면을 포함합니다. 예를 들어, 한 앱에는 제품을 표시하는 화면이 있을 수 있습니다. 사용자가 제품 이미지를 탭하면 새 화면에서 해당 제품의 세부 정보를 표시합니다.
Flutter에서는 화면과 페이지를 "라우트"라고 합니다. 이 문서의 나머지 부분에서는 라우트라는 용어를 사용합니다.
- Android에서 라우트는 액티비티(Activity)와 동등합니다.
- iOS에서 라우트는 뷰컨트롤러(ViewController)와 동등합니다.
- Flutter에서 라우트는 단순히 위젯입니다.
이 문서에서는 Navigator
를 사용하여 새로운 라우트로 이동합니다.
다음 섹션에서는 다음 단계를 사용하여 두 라우트 간에 이동하는 방법을 보여줍니다:
- 두 라우트 생성하기
Navigator.push()
를 사용하여 두 번째 라우트로 이동하기Navigator.pop()
을 사용하여 첫 번째 라우트로 돌아가기
1. 두 라우트 생성하기
먼저, 작업할 두 라우트를 생성합니다. 이 예제는 기본 예제이므로 각 라우트에는 단일 버튼만 포함됩니다. 첫 번째 라우트의 버튼을 탭하면 두 번째 라우트로 이동합니다. 두 번째 라우트의 버튼을 탭하면 첫 번째 라우트로 돌아갑니다.
먼저 시각적 구조를 설정합니다:
class FirstRoute extends StatelessWidget {
const FirstRoute({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('First Route'),
),
body: Center(
child: ElevatedButton(
child: const Text('Open route'),
onPressed: () {
// 탭하면 두 번째 라우트로 이동합니다.
},
),
),
);
}
}
class SecondRoute extends StatelessWidget {
const SecondRoute({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Second Route'),
),
body: Center(
child: ElevatedButton(
onPressed: () {
// 탭하면 첫 번째 라우트로 돌아갑니다.
},
child: const Text('Go back!'),
),
),
);
}
}
2. Navigator.push()
를 사용하여 두 번째 라우트로 이동하기
새로운 라우트로 전환하려면 Navigator.push()
메서드를 사용합니다. push()
메서드는 Navigator
가 관리하는 라우트 스택에 라우트를 추가합니다. 라우트는 어디서 올까요? 직접 생성하거나 MaterialPageRoute
를 사용할 수 있습니다.
MaterialPageRoute
는 플랫폼별 애니메이션을 사용하여 새로운 라우트로 전환하는 데 유용합니다.
FirstRoute
위젯의 build()
메서드에서 onPressed()
콜백을 업데이트합니다:
// `FirstRoute` 위젯 내에서:
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => const SecondRoute()),
);
}
3. Navigator.pop()
을 사용하여 첫 번째 라우트로 돌아가기
두 번째 라우트를 닫고 첫 번째 라우트로 돌아가려면 어떻게 해야 할까요? Navigator.pop()
메서드를 사용합니다. pop()
메서드는 Navigator
가 관리하는 라우트 스택에서 현재 라우트를 제거합니다.
원래 라우트로 돌아가려면 SecondRoute
위젯의 onPressed()
콜백을 업데이트합니다:
// `SecondRoute` 위젯 내에서:
onPressed: () {
Navigator.pop(context);
}
전체 예제
import 'package:flutter/material.dart';
void main() {
runApp(const MaterialApp(
title: 'Navigation Basics',
home: FirstRoute(),
));
}
class FirstRoute extends StatelessWidget {
const FirstRoute({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('First Route'),
),
body: Center(
child: ElevatedButton(
child: const Text('Open route'),
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(builder: (context) => const SecondRoute()),
);
},
),
),
);
}
}
class SecondRoute extends StatelessWidget {
const SecondRoute({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: const Text('Second Route'),
),
body: Center(
child: ElevatedButton(
onPressed: () {
Navigator.pop(context);
},
child: const Text('Go back!'),
),
),
);
}
}
CupertinoPageRoute로 네비게이션
이전 예제에서는 Material Components의 MaterialPageRoute
를 사용하여 화면 간 네비게이션하는 방법을 배웠습니다. 그러나 Flutter에서는 Material 디자인 언어에 국한되지 않으며, iOS 스타일의 Cupertino
위젯도 사용할 수 있습니다.
Cupertino 위젯으로 네비게이션을 구현하는 것은 MaterialPageRoute
를 사용하는 것과 동일한 단계를 따르지만, 대신 iOS 스타일의 전환 애니메이션을 제공하는 CupertinoPageRoute
를 사용합니다.
다음과 같은 위젯들을 교체하면 됩니다.:
MaterialApp
이CupertinoApp
으로 교체Scaffold
가CupertinoPageScaffold
로 교체ElevatedButton
이CupertinoButton
으로 교체
이렇게 하면 예제가 현재 iOS 디자인 언어를 따릅니다.
CupertinoPageRoute를 사용하기 위해 모든 Material 위젯을 Cupertino 버전으로 교체할 필요는 없습니다. Flutter는 필요에 따라 Material과 Cupertino 위젯을 혼합하여 사용할 수 있도록 허용합니다.
'Flutter > 네비게이션' 카테고리의 다른 글
플러터] 네비게이션과 라우팅 - 화면에 드로어(drawer) 추가하기 (0) | 2024.06.30 |
---|---|
플러터] 네비게이션과 라우팅 - 화면에서 데이터 반환하기 (0) | 2024.06.30 |
플러터] 네비게이션과 라우팅 - 새로운 화면에 데이터 보내기 (0) | 2024.06.29 |
플러터] 네비게이션과 라우팅 - 탭(Tap) 작업하기 (0) | 2024.06.29 |
플러터] 네비게이션과 라우팅 - 개요 (0) | 2024.06.29 |