ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • flutter - Navigator
    Flutter 2021. 7. 21. 03:39
    반응형

    [Route]

    -> 스마트폰에 보여지는 하나의 페이지 또는 화면

     

    [Navigator]

    -> 네비게이터란 Route를 스택 자료구조로 관리한다.

     

    -> 스택 자료구조에 대해서 push 와 pop 메소드를 제공한다.

     

    -> Navigator에서 데이터를 쌓을 때에는 push method 를 사용

     

    -> 데이터를 없앨 때에는 pop method 사용

     

     

     

     

    [push]

    -> 페이지의 생성은 push method를 사용한다.

     

    [Navigator의 요구 인자]

     

    -> Navigator는 context 와 route를 인자로 요구한다.

     

    -> context가 가지고 있는 위젯 트리의 위치 정보에 근거해서, 현재 화면 상에 보여주는 페이지가 어떤 페이지인지 확인하고 이 페이지 위에 푸쉬 함수가 이동하기 원하는 새로운 라우트를 쌓아 올려야 하기 때문이다.

     

    ->  FirstPage 위로 SecondPage를 쌓아 올리기 위해서는 FirstPage 의 위치를 정확히 알아야 하기 때문에 FirstPagecontext가 필요하다.

     

     

     

     

    -> route 부분에는 바로 SecondPage가 오는게 아니라 MaterialPageRoute( builder: builder) 가 들어간다.

     

    -> builder는 어떤 위젯이 MaterialPageRoute의 도움을 받아 생성 될 지 정의하는 속성

     

    -> 바로 이동할 위젯을 넣는게 아니라 굳이 MaterialPageRoute와  builder를 거쳐서 가는 이유는 라우트 호출 간에 생길 수 있는 에러를 builder를 사용하여 미연에 방지하도록 안전 장치를 거는 것이다.

     

     

     

     

     

     

    [pop]

    -> pop 은 이전보다 더 간단하다.

     

    -> first page 위에 second page가 올라와 쌓여있는 스택 구조이기 때문에 기존 second page를 걷어내면 first page가 나오게 된다.

     

     

     

    -> 이 뒤로가기 버튼은 Scaffold를 사용해서 앱바를 생성하면 자동으로 플러터가 페이지 이동시 뒤로가기 버튼을 만들어준다.

     

    -> 그래서 굳이 pop method를 구현하지 않아도 된다.

     

    -> 앱바를 생성하지 않을 때 뒤로가기 기능을 구현하기 위해서는 pop이 필요하다.

     

    [최종 코드]

    import 'package:flutter/material.dart';
    
    void main(List<String> args) {
      runApp(MyApp());
    }
    
    class MyApp extends StatelessWidget {
      const MyApp({Key? key}) : super(key: key);
    
      @override
      Widget build(BuildContext context) {
        return MaterialApp(
          debugShowCheckedModeBanner: false,
          title: 'Navigator',
          theme: ThemeData(primarySwatch: Colors.blue),
          home: FirstPage(),
        );
      }
    }
    
    class FirstPage extends StatelessWidget {
      const FirstPage({Key? key}) : super(key: key);
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text('First Page'),
            //centerTitle: true,
          ),
          body: Center(
            child: ElevatedButton(
              child: Text('Go to the Second Page'),
              onPressed: (){
                Navigator.push(context, MaterialPageRoute(
                    builder: (_) => SecondPage()));
              },
    
            ),
          ),
        );
      }
    }
    
    
    class SecondPage extends StatelessWidget {
      const SecondPage({Key? key}) : super(key: key);
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text('Second Page'),
            //centerTitle: true,
          ),
          body: Center(
            child: ElevatedButton(
              child: Text('Go to the First Page'),
              onPressed: (){
                Navigator.pop(context); 
                // 기존 First page 위에 쌓여있던 Second Page가 없어지는 것
    
              },
    
            ),
          ),
        );
      }
    }

     

     

     

    300x250

    'Flutter' 카테고리의 다른 글

    flutter - 플러터 2.0 버튼  (0) 2021.07.22
    flutter - 멀티 페이지 이동  (0) 2021.07.21
    flutter - 컬럼 위젯, 로우 위젯  (0) 2021.07.21
    flutter - 컨테이너 위젯(Container widget)  (0) 2021.07.20
    flutter - Toast Message  (0) 2021.07.20

    댓글

Designed by Tistory.