본문으로 이동

플러터:화면 전환(화면 쌓기, 하단 네비게이션 바): 두 판 사이의 차이

학교의 모든 지식. SMwiki
잔글편집 요약 없음
편집 요약 없음
3번째 줄: 3번째 줄:
== 개요 ==
== 개요 ==
네이게이션을 통한 화면전환.
네이게이션을 통한 화면전환.
== 개요 ==
Flutter 앱에서 화면을 이동하는 가장 기본적인 방식은 Navigator를 사용하는 것이다.
Navigator는 “화면(stack)”을 관리하며, 새로운 페이지를 push하여 화면을 열고 pop하여 닫는다.


이 문서에서는 가장 단순한 두 화면 간 전환 예제를 통해 Navigator의 기본 개념을 이해한다.
* Flutter 앱에서 화면을 이동하는 가장 기본적인 방식은 Navigator를 사용하는 것이다.
* Navigator는 “화면(stack)”을 관리하며, 새로운 페이지를 push하여 화면을 열고 pop하여 닫는다.


= 기본 화면 전환 전체 코드 =
= 기본 화면 전환 =
<syntaxhighlight lang="dart">
<syntaxhighlight lang="dart">import 'package:flutter/material.dart';
import 'package:flutter/material.dart';


void main() {
void main() {
runApp(MyApp());
  runApp(MyApp());
}
}


class MyApp extends StatelessWidget {
class MyApp extends StatelessWidget {
@override
  @override
Widget build(BuildContext context) {
  Widget build(BuildContext context) {
return MaterialApp(
    return MaterialApp(
title: 'Navigator Demo',
      title: 'Navigator Demo',
debugShowCheckedModeBanner: false,
      debugShowCheckedModeBanner: false,
home: FirstPage(),
      home: FirstPage(),
);
    );
}
  }
}
}


class FirstPage extends StatelessWidget {
class FirstPage extends StatelessWidget {
// StatelessWidget: 상태(state)를 가지지 않는 화면
  // StatelessWidget: 상태(state)를 가지지 않는 화면
 
  @override
@override
  Widget build(BuildContext context) {
Widget build(BuildContext context) {
    return Scaffold(
return Scaffold(
      appBar: AppBar(
appBar: AppBar(title: Text("첫 번째 화면")),
        title: Text("첫 번째 화면"),
 
      ),
  body: Center(
      body: Center(
    child: ElevatedButton(
        child: ElevatedButton(
      child: Text("두 번째 화면으로 이동"),
          child: Text("두 번째 화면으로 이동"),
      onPressed: () {
          onPressed: () {
        // 화면 이동 (push)
            // 화면 이동 (push)
        Navigator.push(
            Navigator.push(
          context,
              context,
          MaterialPageRoute(builder: (_) => SecondPage()),
              MaterialPageRoute(builder: (_) => SecondPage()),
        );
            );
      },
          },
    ),
        ),
  ),
      ),
);
    );
 
  }
 
}
}
}


class SecondPage extends StatelessWidget {
class SecondPage extends StatelessWidget {
// 두 번째 화면도 상태를 가지지 않는 StatelessWidget
  // 두 번째 화면도 상태를 가지지 않는 StatelessWidget
 
  @override
@override
  Widget build(BuildContext context) {
Widget build(BuildContext context) {
    return Scaffold(
return Scaffold(
      appBar: AppBar(
appBar: AppBar(title: Text("두 번째 화면")),
        title: Text("두 번째 화면"),
 
      ),
  body: Center(
      body: Center(
    child: Text(
        child: Text(
      "여기는 두 번째 화면!",
          "여기는 두 번째 화면!",
      style: TextStyle(fontSize: 24),
          style: TextStyle(fontSize: 24),
    ),
        ),
  ),
      ),
);
    );
 
  }
 
}
}
}
</syntaxhighlight>
</syntaxhighlight>


= 이해를 위한 추가 설명 =
== 이해를 위한 추가 설명 ==
{| class="wikitable"
{| class="wikitable"
!요소
!요소
81번째 줄: 74번째 줄:


!비고
!비고
|-
|화면을 위에 올리기.
Navigator.push
Navigator.push
<syntaxhighlight lang="dart">
|<syntaxhighlight lang="dart">
Navigator.push(
Navigator.push(
context,
context,
92번째 줄: 87번째 줄:


MaterialPageRoute는 기본적인 화면 전환 애니메이션을 제공한다.
MaterialPageRoute는 기본적인 화면 전환 애니메이션을 제공한다.
|새 화면 열기
|마테리얼 디자인 규칙에 따라 뒤로가기가 가능하면 자동으로 뒤로가기 버튼이 생긴다.
|-
|-
|Navigator.pop
|뒤로 가기
Navigator.pop
|<code>Navigator.pop(context)</code>
|<code>Navigator.pop(context)</code>


현재 페이지를 스택에서 제거(pop)하여 이전 화면으로 돌아간다.
현재 페이지를 스택에서 제거(pop)하여 이전 화면으로 돌아간다.
뒤로 가기
StatelessWidget
두 페이지 모두 StatelessWidget이므로 상태(state)가 없다.
이 예제에서는 화면의 상태 변화가 없기 때문에 StatelessWidget 사용.
상태가 필요한 경우 StatefulWidget을 사용한다.
|
|-
|builder: (context) ⇒ SecondPage()
|MaterialPageRoute가 새로운 화면을 생성하는 방법을 정의한다.
builder는 위젯을 “생성해주는 함수”이다.
|
|
|}
|}
115번째 줄: 100번째 줄:


=== 왜 push()는 context가 필요한가? ===
=== 왜 push()는 context가 필요한가? ===
Navigator는 위젯 트리 안에 존재하는 “Navigator State”를 찾아야 하는데,
Navigator는 위젯 트리 안에 존재하는 “Navigator State”를 찾아야 하는데, 이를 위해 현재 위젯의 BuildContext가 필요하다.
이를 위해 현재 위젯의 BuildContext가 필요하다.


BuildContext는 “현재 위젯이 트리에서 어디 위치하는지”를 나타내는 정보다.
BuildContext는 “현재 위젯이 트리에서 어디 위치하는지”를 나타내는 정보다.
123번째 줄: 107번째 줄:
있다.
있다.


CupertinoPageRoute (iOS 스타일 전환)
* CupertinoPageRoute (iOS 스타일 전환)
 
* PageRouteBuilder (전환 애니메이션 직접 커스텀)
PageRouteBuilder (전환 애니메이션 직접 커스텀)
* go_router, auto_route 같은 라우팅 라이브러리
 
go_router, auto_route 같은 라우팅 라이브러리


기본 예제는 MaterialPageRoute로 충분하다.
기본 예제는 MaterialPageRoute로 충분하다.


=== StatelessWidget 화면에서도 Navigator 사용이 가능한가? ===
= 다른 프로젝트 =
가능하다.
 
Navigator는 상태 변경과 관련이 없으므로,
StatelessWidget에서도 문제없이 화면 전환을 할 수 있다.

2025년 11월 16일 (일) 15:45 판

틀:플러터 Dart:개요 플러터에 대한 지식 분류

  1. 플러터:개요
    1. 플러터:VSCode
    2. 플러터:안드로이드 스튜디오
  2. 플러터:실행
  3. 플러터:개념 잡기
    1. 플러터:화면 하나 만들기
    2. 플러터:변하는 화면(StatefulWidget)
    3. 플러터:화면 전환(화면 쌓기, 하단 네비게이션 바)
    4. 플러터:화면 전환(Drawer)
    5. 플러터:입력 관련
      1. 플러터:버튼
      2. 플러터:키보드 입력
      3. 플러터:슬라이더
    6. 플러터:그래프 그리기(fl chart)
    7. 플러터:데이터 저장(간단한 데이터)
    8. 플러터:인증(Firebase 인증)(미완)
    9. 플러터:인증(OAuth2)(미완)
  4. 권한 사용
    1. 플러터:마이크 입력
  5. 위젯
    1. 플러터:아이콘
    2. 플러터:레이아웃 계열 위젯
    3. 플러터:네비게이션 계열 위젯
    4. 플러터:버튼
    5. 플러터:상태관리(미완)
  6. 플러터:DB연결
    1. 플러터:Firebase(미완)
    2. 플러터:MySQL(미완)
  7. 디자인
    1. 플러터:테마
    2. 플러터:앱바
  8. 플러터:배포
  9. 플러터:참고자료
  10. 플러터:위젯
    1. 플러터:공간배치용 위젯
  11. 플러터:라이브러리
    1. 플러터:logger

개요

네이게이션을 통한 화면전환.

  • Flutter 앱에서 화면을 이동하는 가장 기본적인 방식은 Navigator를 사용하는 것이다.
  • Navigator는 “화면(stack)”을 관리하며, 새로운 페이지를 push하여 화면을 열고 pop하여 닫는다.

기본 화면 전환

import 'package:flutter/material.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Navigator Demo',
      debugShowCheckedModeBanner: false,
      home: FirstPage(),
    );
  }
}

class FirstPage extends StatelessWidget {
  // StatelessWidget: 상태(state)를 가지지 않는 화면
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("첫 번째 화면"),
      ),
      body: Center(
        child: ElevatedButton(
          child: Text("두 번째 화면으로 이동"),
          onPressed: () {
            // 화면 이동 (push)
            Navigator.push(
              context,
              MaterialPageRoute(builder: (_) => SecondPage()),
            );
          },
        ),
      ),
    );
  }
}

class SecondPage extends StatelessWidget {
  // 두 번째 화면도 상태를 가지지 않는 StatelessWidget
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text("두 번째 화면"),
      ),
      body: Center(
        child: Text(
          "여기는 두 번째 화면!",
          style: TextStyle(fontSize: 24),
        ),
      ),
    );
  }
}

이해를 위한 추가 설명

요소 설명 비고
화면을 위에 올리기.

Navigator.push

Navigator.push(
context,
MaterialPageRoute(builder: (_) => SecondPage()),
);

새로운 페이지를 스택 위에 ‘올려서’ 이동한다.

MaterialPageRoute는 기본적인 화면 전환 애니메이션을 제공한다.

마테리얼 디자인 규칙에 따라 뒤로가기가 가능하면 자동으로 뒤로가기 버튼이 생긴다.
뒤로 가기

Navigator.pop

Navigator.pop(context)

현재 페이지를 스택에서 제거(pop)하여 이전 화면으로 돌아간다.

의문

왜 push()는 context가 필요한가?

Navigator는 위젯 트리 안에 존재하는 “Navigator State”를 찾아야 하는데, 이를 위해 현재 위젯의 BuildContext가 필요하다.

BuildContext는 “현재 위젯이 트리에서 어디 위치하는지”를 나타내는 정보다.

MaterialPageRoute 말고 다른 것도 있나?

있다.

  • CupertinoPageRoute (iOS 스타일 전환)
  • PageRouteBuilder (전환 애니메이션 직접 커스텀)
  • go_router, auto_route 같은 라우팅 라이브러리

기본 예제는 MaterialPageRoute로 충분하다.

다른 프로젝트