[플러터] 내비게이션 활용하기

ho's·2022년 8월 16일
0

Do it 플러터 앱 프로그래밍 책 공부하기

책의 내용을 정리하면서 공부하기 위해, 글을 작성한다.


내비게이션 활용하기

  • 한 페이지로도 앱을 만들 수 있지만 기능이 많으면 화면을 구성하기가 어렵고 로딩이 느려지기도 한다.

  • 네비게이션 기능은 앱이 제공하는 기능이나 메뉴별로 화면을 분리해서 개발하는 방법

페이지 이동하기만들기

1. 프로젝트 생성 및 main.dart 파일 생성

import 'package:flutter/material.dart';

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

class MyApp extends StatelessWidget {
  
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Subpage Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: FirstPage(),
    );
  }
}

class FirstPage extends StatefulWidget {
  
  State<FirstPage> createState() => _FirstPage();
}

class _FirstPage extends State<FirstPage> {
  
  Widget build(BuildContext context){
    return null;
    }
  }

2. _FirstPage 클래스에 위젯으로 화면 만들기

class _FirstPage extends State<FirstPage> {
  
  Widget build(BuildContext context){
    return Scaffold(
      appBar: AppBar(
        title: Text('Sub Page Main '),
      ),
      body: Container(
        child: Center(
          child: Text('첫 번째 페이지'),
        ),
      ),
      floatingActionButton: FloatingActionButton(
        onPressed: (){},
        child: Icon(Icons.add),
      ),
    );
    }
  }

3. 두번째 페이지 만들기

_FirstPage 아래에 StatelessWidget을 상속받아 SecondPage 클래스를 만든다.

class SecondPage extends StatelessWidget {
    
    Widget build(BuildContext context) {
      return Scaffold(
        appBar: AppBar(
          title: Text('Second Page'),
        ),
        body: Container(
          child: Center(
            child: RaisedButton(
              onPressed: (){},
              child: Text('돌아가기'),
            ),
          )
        )
      );
    }
  }

4. _FirstPage 클래스에 만든 플로팅 버튼을 눌렀을 때 호출되는 onPressed이벤트 처리 함수 작성

  floatingActionButton: FloatingActionButton(
        onPressed: (){
          Navigator.of(context)
              .push(MaterialPageRoute(builder: (context)=> SecondPage()));
        },
        child: Icon(Icons.add),
      ),

위의 코드를 해석해 보자!

  • Navigator는 스택을 이용해 페이지를 관리할 때 사용하는 클래스
  • Navigator클래스의 of(context) 함수는 현재 페이지를 나타내고 push()함수는 스택에 페이지를 쌓는 역할
  • 따라서 위의 코드는 플로팅 버튼을 눌렀을 때, 스택 메모리에 페이지가 쌓이는 구조이다.
  • push()함수에 전달한 MaterialPageRoute()함수는 머터리얼 스타일로 페이지를 이동하게 해준다.

5. secondPage 클래스에 <돌아가기> 버튼을 눌렀을때 호출되는 onPressed 이벤트 처리 함수를 작성

  class SecondPage extends StatelessWidget{
    
    Widget build(BuildContext context) {
      return Scaffold(
        appBar: AppBar(
          title: Text('Second Page'),
        ),
        body: Container(
          child: Center(
            child: RaisedButton(
              onPressed: (){
                Navigator.of(context).pop();
              },
              child: Text('돌아가기'),
            ),
          )
        )
      );
    }
  }
  • Navigator.of() 함수에 이어서 호출한 pop() 함수는 스택 메모리에서 맨 위에 있는 페이지를 제거한다.
  • 두 번째 페이지가 보인다는 것은 현재 스탯 메모리 맨 위에는 SecondPage가 있다는 의미이다.
  • 따라서 두 번째 페이지에 있는 <돌아가기> 버튼을 누르면 두 번째 화면이 사라지고 첫 번째 화면이 보이게 된다.

라우트페이지로 이동하기

  • 라우트란? 통신에서 이동 경로를 의미하는 용어이다.
  • 네트워크 프로그래밍에서는 요청 URL을 해석해 정해진 경로로 이동하는 기능을 라우트라고 한다.
  • 이러한 라우트 기능을 이용하면 페이지 이동 기능을 좀 더 편리하게 한다.

라우트를 이용해 페이지 이동하기

main.dart에서 MaterialApp을 선언하는 부분에 Home을 지우고 다음과 같이 코드를 작성한다.

  • home 대신에 initialRoute와 routes를 사용했다.
  • initailRoute에서는 처음 앱을 시작했을때 보여줄 경로를 지정한다.

기존 코드를 라우트를 이용한 페이지이동을 위한 코드로 바꾸어 보자.

profile
그래야만 한다

0개의 댓글