화면 전환을 제공하려면 Route와 Navigator를 사용한다.
다음 화면으로 전환: Navigator.push()
이전 화면으로 전환: Navigator.pop()
push함수로 계속 전환하면 화면이 많아지면 비효율적이다. 이런 상황에서 라우트 이름으로 화면을 전환하면 효율적이다.
MaterialApp(
initialRoute: '/one',
routes: {
'/one': (context) => const OneScreen(),
'/two': (context) => const SecondScreen(),
'/three': (context) => const ThirdScreen(),
'/four': (context) => const FourthScreen(),
},
);
ElevatedButton(
onPressed: () {
Navigator.pushNamed(context, '/two');
},
child: const Text(
'Go Second',
),
),
push(), pushNamed(), pop() 함수를 이용해 화면 전환
Navigator.push(context, MaterialPageRoute(builder: (context) => SecondScreen("hello")));
ElevatedButton(
onPressed: () async {
final result =
await Navigator.pushNamed(context, '/two', arguments: {
"arg1": 1,
"arg2": "hello",
"arg3": User('kkang', 'seoul'),
});
print('result: ${(result as User).name}');
},
child: const Text(
'Go Second',
),
),
Map<String, Object> args =
ModalRoute.of(context)?.settings.arguments as Map<String, Object>;
ElevatedButton(
onPressed: () {
Navigator.pop(
context,
User('kim', 'busan'),
);
},
)
pop( ) 함수로 전달한 데이터는 화면을 전환할 때 사용했던 push( ) 나 pushNamed( ) 함수의 반환값으로 받을 수 있다.
routes와 onGenerateRoute의 차이점
같은 라우트 이름이라도 상황에 따라 다른 화면이 나오게 하고 싶을 때가 있다. 이럴 때 데이터를 분석해 동적인 라우트가 필요할 때 onGenerateRoute속성을 사용한다