페이지 이동에는 크게 2가지 파트가 있다.
- 위젯을 상속한 클래스를 생성하고 호출하여 직접 이동
- 이동 단위(?) 를 Route 라고 한다
- materialapp 또는 cupertinoapp 에 미리 Route 를 정의하고, string 값인 name을 통해 이동
1. 직접 이동
- 애니메이션 효과를 위해 MaterialPageRoute 함수를 이용한다.
- Navigator.push() 를 이용하여 이동한다. 이때 현재 페이지는 history인 Route에 쌓이게 된다.
Navigator.push(context, MaterialPageRoute(builder : (context) => 이동할 클래스명()),);
- 이전 페이지, 즉 이전 Route로 돌아가기 위해서는 Navigator.pop(context) 를 사용하면 된다.
2. Route 정의하기
- MaterialApp 혹은 CupertinoApp 함수 인자값인 routes 에 정의
- <string, WidgetBuilder> 형태로 페이지 정의
class MyApp extends StatelessWidget {
const MyApp({super.key});
// This widget is the root of your application.
@override
Widget build(BuildContext context) {
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: const MyHomePage(title: 'Flutter Demo Home Page'),
routes: <String,WidgetBuilder>{
'/페이지명1' : (BuildContext (context) => Widget클래스명1(),
'/페이지명2' : (BuildContext (context) => Widget클래스명2(),
)
},
);
}
}
3. name을 통해 이동
- 이동하기 : Navigator.pushNamed(context, '이동할 페이지명');
- 앞으로 되돌아가기 : Navitator.pop(context);
4. 인자값 전달하기.
- 전달할 클래스 생성
class testclass {
string arg1;
string arg2;
testclass(this.arg1,this.arg2);
}
- 위젯 생성 및 인자값 설정
......
@override
Widget build (BuildContext context) {
final arg클래스명 변수명 = ModalRoute.of(context).settings.arguments;
.....
변수명.arg1 등으로 접근하여 사용
- Route 설정 후 호출시 인자값 전달
Navigator.pushNamed(
context,
'루트이름'
,arguments : arg클래스명(arg1값, arg2값..),
);
5. 이전 화면으로 되돌아 갈때 데이터 반환
- Navigator.pop 함수에 리턴할 인자값 포함
...
Navigator.pop(context,리턴값);
...
- Navigator.push 시, await 사용 (해당 코드가 포함된 함수에 Future 선언이 되어 있어야 한다.)
.....
final result = await Navigator.push
(context,
MaterialPageRoute(builder:(context) => 이동클래스명()),
);
...
6. Navigator 함수 내용 정리
- push, pushNamed, pop 은 위에 설명했으므로 제외
6.1. pushAndRemoveUntil, pushNamedAndRemoveUntil
- 홈 루트를 제외한 모든 route를 제거하고 지정된 페이지를 push
Navigator.pushAndRemoveUntil(context,
MaterialPageRoute(builder:(context) => 이동할페이지클래스()),루트클래스
);
Navigator.pushNamedAndRemoveUntil(context, '루트명', 루트클래스);
6.2. popAndPushNamed
- 현재 페이지를 pop 하고 지정한 페이지를 push
Navigator.popAndPushNamed(context,'route명');
6.3. canPop
- pop이 가능한지 여부를 bool 로 리턴
- 인자값은 context 밖에 없음.
6.4. pushReplacement, pushReplacementNamed
- 현재 화면을 대체함.
Route route = MaterialPageRoute(builder: (context) => NextPage());
Navigator.pushReplacement(context, route);
Navigator.pushReplacementNamed(context, '루트명');'Flutter' 카테고리의 다른 글
| Stateful 과 Stateless Widget 둘 중 어느걸 사용할지 고민될때 확인 (0) | 2023.04.26 |
|---|---|
| State 클래스 에서 Stateful 클래스 맴버변수 접근법 (0) | 2023.04.26 |
| 가장 첫번째 스탭 : VSCode 에서 플러터 프로젝트 생성 및 빌드 (0) | 2023.04.18 |
| BottomNavigationBar 및 BottomNavigationBarItem 위젯 (0) | 2023.03.24 |
| Listview 및 ListTile 위젯 (0) | 2023.03.24 |