파파비의 블로그
플러터, flutter) 화면을 전환하는 방법, Navigator (push, pushNamed + data 이동방법 ModalRoute) 본문
플러터, flutter) 화면을 전환하는 방법, Navigator (push, pushNamed + data 이동방법 ModalRoute)
N. Dave 2020. 6. 2. 10:25<기본적인 방법>
버튼이 클릭 되었을 때, 위 함수를 시키면 CategoryMealsScreen() 이라는 위젯이 새로운 페이지로 형성된다.
그리고 당연히 screen stack 맨위에 쌓인다.
우리는 화면 간 이동을 할 때, Navigator를 사용한다.
스택정보와 위젯들의 여러 관계를 파악하기 위해 context를 필요로 하며. 그 정보를 바탕으로
push와 pop이 가능하다.
그리고 pushNamed, pushAndRemove 등 다양한 부가 기능들도 가능하다.
push에 인자로 들어가는 것은 페이지 관련 위젯이고,
MaterialPageRoute이나 CuppetinoPageRoute도 가능하다
MaterialPageRoute안에 빌더에 생성되길 원하는 위젯을 넣으면 되는데,
그 위젯에는 scaffold가 있어야 한다. 페이지에 뼈대를 잡아줄 수 있는 위젯이 필요하기 때문,
또한 생성자를 통해서 data를 전달해서 맞춤형 페이지가 가능하다.
<좀 더 복잡하지만, 깔끔한 방법>
만약 앱이 커져서 페이지 수가 매우 많아지고, 그렇게 되면 일일이 위젯에 저렇게 메소드를 마구마구 넣어두는 건,
관리하기가 매우 어려워질 것이다. 하나의 위젯이 바뀌기만 해도 여러번 고쳐야 할 수도 있고
bug의 가능성이 매우 높아진다. 그래서 우리는 Route들을 하나로 관리할 수 있다.
바로 MaterialApp > routes 라는 속성으로 말이다.
여기를 보면 MaterialApp 안에 routes 속성을 둘 수 있음을 알 수 있다.
또한, routes는 Map을 인자로 받는데, key는 string 타입이고, value는 위젯을 return하고, context를 인자로 받는 function이다.
value 값은 페이지를 생성하는 builder다. 따라서 저기서 return되는 위젯은 scaffold 위젯을 가진 페이지를 형성할 수 있는 위젯이어야 한다.
이런식으로 Map이니까 { } 를 활용해주고, key값은 아무런 string값이면 된다.
다만 flutter는 웹에서 따온 개념들이 많아서, url처럼 /로 시작하는 경우가 많다만, 편한대로 하면 된다.
그런데 문제가 있다.
MaterialApp단위에서 routes들을 설정하면, data를 어떻게 넘겨 줄 것인가?
일단 routes가 있는 class에 데이터가 있다면, 그냥 생성자를 통해서 넘겨주어도 된다.
but data가 그 class에 없다면??
이는 방법이 따로 있다.
우리는 Navigator를 통해 push할 때, data를 집어 넣을 것이다.
routes를 사용하게 되면, 저렇게 key: builder 형태로 Map이 형성된다.
따라서, Navigator를 쓸 때는 pushNamed라는 메소드를 통해 안에 루트의 key값을 그대로 넣어준다.
그리고 여기에 우리가 원하는 data를 arguments라는 속성을 이용해 함께 넣을 수 있다.
arguments의 인자는 Object이다. 아무거나 다 가능하다.
data가 여러개 라면 당연히 collection 형태가 좋을 것이다.
여기서는 맵을 활용했다.
그러면 Data는 어떻게 읽어올까?
1. 일단 생성자 부분에서 변수를 설정하게 되면 생성자를 따로 선언해주어야 하므로, 다 지워준다. 어차피 필요없기 떄문이다.
2. build 메소드에서, ModalRoute라는 class를 활용해서 data를 얻어온다.
of.context에서 settings에 arguments가 있다. 얘는 object이므로,
as~를 활용해서 확실하게 data type을 변환해주면, value를 읽어올 때도 에러가 뜨지 않는다.
build를 할 때, data를 읽어와서 변수를 선언하고,
곧장 초기화 한 뒤 그 value를 사용하면 된다.
이 부분이 복잡해 보일 순 있지만, 필요한 절차이다.
앱이 커지면 역시 clean code가 중요하다.
'개발 > flutter' 카테고리의 다른 글
플러터, flutter) 큰 데이터에서 데이터 추리고 위젯만들기 ! (where & listview.builder) (0) | 2020.06.05 |
---|---|
플러터, flutter) NamedRoutes 쓸 때 주의 할 점 (0) | 2020.06.05 |
플러터, flutter) GestureDetector + 시각효과 = Inkwell (0) | 2020.06.02 |
플러터, flutter) ThemeData와 font 다양한 스타일로 넣기 (0) | 2020.06.02 |
플러터, flutter) Gradient 사용하기 (0) | 2020.05.31 |