Flutter
[ Flutter ] Navigation 사용하여 화면이동
사과씨앗
2022. 10. 30. 18:06
728x90
반응형
안녕하세요 이번 글에서는 Navigation을 이용하여 보겠습니다.
프로젝트의 디렉터리와 파일을 다음과 같이 생성
main.dart
import 'package:flutter/material.dart';
import 'package:navigation_practiec/screen/home_screen.dart';
import 'package:navigation_practiec/screen/one_screen.dart';
import 'package:navigation_practiec/screen/three_screen.dart';
import 'package:navigation_practiec/screen/two_screen.dart';
void main() {
runApp(MaterialApp(
initialRoute: '/', // 처음 시작 screen 설정
routes: {
// 앞에 선언한 스트링에 맞게 context 를 해당 위젯으로 반환
'/':(context) => HomeScreen(),
'/one':(context) => OneScreen(),
'/two':(context) => TwoScreen(),
'/three':(context) => ThreeScreen(),
},
));
}
one_screen.dart
import 'package:flutter/material.dart';
class OneScreen extends StatelessWidget {
const OneScreen({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('OneScreen'),
),
body: Padding(
padding: const EdgeInsets.symmetric(horizontal: 5.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
ElevatedButton(
onPressed: () {
Navigator.of(context).pushNamed('/two');
},
child: Text('push'),
),
ElevatedButton(
onPressed: () {
Navigator.of(context).pop();
},
child: Text('pop'),
),
ElevatedButton(
onPressed: () {
Navigator.of(context).maybePop();
},
child: Text('maybePop'),
),
],
),
),
);
}
}
two_screen.dart
import 'package:flutter/material.dart';
import 'package:navigation_practiec/screen/three_screen.dart';
class TwoScreen extends StatelessWidget {
const TwoScreen({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('TwoScreen'),
),
body: Padding(
padding: const EdgeInsets.symmetric(horizontal: 5.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
ElevatedButton(
onPressed: () {
// 자신의 스택을 삭제하고 다음스택으로 넘어간다 1->2(삭제)->3
// 3에서 pop 을 할 경우 1로 돌아간다.
Navigator.of(context).pushReplacement(
MaterialPageRoute(builder: (BuildContext context)
=> ThreeScreen()
),
);
},
child: Text('pushReplacement'),
),
ElevatedButton(
onPressed: () {
// Named 를 사용하여 미리 선언해둔 route 를 사용
Navigator.of(context).pushReplacementNamed('/three');
},
child: Text('pushReplacementNamed'),
),
ElevatedButton(
onPressed: () {
// pushAndRemoveUntil -> route 로 지정한 stack 을 제외하고 나머지 삭제
// false 일 경우 다음으로 넘어가는 stack 만 남기고 전부 삭제
Navigator.of(context).pushAndRemoveUntil(
MaterialPageRoute(builder: (BuildContext context) => ThreeScreen())
, (route) => route.settings.name == '/');
},
child: Text('pushAndRemoveUntil'),
),
],
),
),
);
}
}
three_screen.dart
import 'package:flutter/material.dart';
class ThreeScreen extends StatelessWidget {
const ThreeScreen({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(
'ThreeScreen',
),
),
body: Padding(
padding: const EdgeInsets.symmetric(horizontal: 5.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
ElevatedButton(
onPressed: () {
Navigator.of(context).pop();
},
child: Text('Pop'),
)
],
),
),
);
}
}
728x90
반응형