1. 페이지 설정
@override
Widget build(BuildContext context) {
return MaterialApp(
debugShowCheckedModeBanner: false,
initialRoute: "/login",
routes: {
// Dart에서는 BuildContext context의 타입을 명시하지 않아도 됩니다.
"/login": (context) => LoginPage(),
"/home": (context) => HomePage(),
},
);
}
}
코드설명
1.initialRoute: "/login"
initialRoute
는 앱이 처음 실행될 때 어떤 경로를 보여줄지 결정하는 속성입니다. 여기서는"/login"
경로가 설정되어 있으므로 앱이 실행되면 로그인 페이지(LoginPage
)가 처음 표시됩니다.
2. routes
- *
routes
*는 앱 내에서 사용할 수 있는 경로(페이지)와 그 경로에 해당하는 위젯을 정의하는 맵입니다.
- 각 경로는 키(
"/login"
,"/home"
)와 그 경로에 연결될 위젯을 반환하는 함수로 매핑됩니다.
3. /login: (context) => LoginPage()
"/login"
경로로 이동할 때LoginPage
위젯을 렌더링합니다.
- 이 부분에서
context
는BuildContext
타입으로 자동으로 전달되며, 위젯 트리에서 현재 위젯의 위치와 관련된 정보를 제공합니다.
4. /home: (context) => HomePage()
"/home"
경로로 이동할 때HomePage
위젯을 렌더링합니다.
Navigator.pushNamed()
등을 통해 이 경로로 화면 이동을 할 수 있습니다.
2. LoginPage
// 로그인 페이지
class LoginPage extends StatelessWidget {
// 전역변수 필요함: TextEditingController는 사용자가 입력한 값을 바인딩 해줍니다.
final TextEditingController username = TextEditingController();
final TextEditingController password = TextEditingController();
@override
Widget build(BuildContext context) {
// Hot reload는 Scaffold만 가능하다는 점 참고
return Scaffold(
body: ListView(
// 화면을 스크롤할 수 있도록 리스트뷰 사용
padding: EdgeInsets.all(16.0), // 여백 추가
children: [
Container(
height: 200,
color: Colors.yellow,
child: Center(
child: Text(
"Welcome",
style: TextStyle(fontSize: 24, fontWeight: FontWeight.bold),
),
),
),
SizedBox(height: 20),
// Username 입력 필드
TextFormField(
controller: username,
decoration: InputDecoration(
hintText: "Username",
prefixIcon: Icon(Icons.person),
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(8.0),
),
),
),
SizedBox(height: 20),
// Password 입력 필드
TextFormField(
controller: password,
obscureText: true, // 비밀번호는 안 보이도록 설정
decoration: InputDecoration(
hintText: "Password", //입력 필드 안에 표시할 힌트 텍스트
prefixIcon: Icon(Icons.password),
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(8.0),
),
),
),
SizedBox(height: 30),
// 로그인 버튼: 리턴이 없는 것은 익명함수를 사용함
ElevatedButton(
onPressed: () {
// 동기적으로 실행하기 위해 await와 async를 사용할 수 있습니다.
// 1. 값 가져오기
String un = username.text;
String pw = password.text;
print(un);
print(pw);
print("버튼 클릭됨");
// 2. 통신하기 (여기에 API 호출 로직 추가 가능)
// 3. 화면 이동 (A -> B)
// 화면 이동 방법 3가지:
// 1. Navigator.pushNamed: [A, B] 쌓임, 즉 현재 페이지에 이어서 새로운 페이지가 스택에 쌓임
// 2. Navigator.pushReplacementNamed: [B]만 쌓임, 즉 현재 페이지를 대체하고 새로운 페이지가 쌓임
// 3. Navigator.pushNamedAndRemoveUntil: 특정 조건에 따라 기존 스택을 비우고 새로운 페이지가 쌓임
Navigator.pushNamed(context, "/home"); // "/home" 경로로 이동
},
child: Text("로그인"),
style: ElevatedButton.styleFrom(
padding: EdgeInsets.symmetric(vertical: 16.0),
textStyle: TextStyle(fontSize: 18),
),
),
],
),
);
}
}

- 로그인 버튼 누르면


코드설명
1.TextEditingController
:
username
과password
라는 두 개의TextEditingController
를 정의했습니다. 이 컨트롤러들은 각각 사용자 이름과 비밀번호를 입력받는 텍스트 필드를 제어하며, 입력된 데이터를 바인딩하는 역할을 합니다.
2.TextFormField
:
- 사용자 이름과 비밀번호를 입력받기 위한 두 개의
TextFormField
가 있습니다. 각각의 필드에는hintText
와prefixIcon
이 설정되어 있고, 테두리는 둥근 모서리로 되어 있습니다.obscureText
속성은 비밀번호 필드를 보호하여 입력된 텍스트를 보이지 않게 처리합니다.
3.ElevatedButton
:
- 로그인 버튼입니다. 버튼을 클릭하면
onPressed
함수가 호출됩니다. 이 함수에서username
과password
필드에 입력된 값을 가져오고, 그 값을 출력한 뒤, 로그인 성공 시 다음 페이지(/home
)로 이동합니다.
4.Navigator.pushNamed
:
Navigator.pushNamed
는 지정된 경로로 이동하는 Flutter의 네비게이션 메서드입니다. 현재 페이지를 스택에 쌓고,/home
경로에 해당하는 화면으로 이동합니다.
3. HomePage
// 홈 페이지
class HomePage extends StatelessWidget {
const HomePage({super.key});
@override
Widget build(BuildContext context) {
return Scaffold(
// AppBar를 만들면 자동으로 뒤로가기 아이콘이 생성됩니다.
appBar: AppBar(
title: Text("Home"),
),
body: Center(
child: ElevatedButton(
onPressed: () {
// 화면 이동 방법 예시:
// 1. [A -> B -> A]
// Navigator.pushNamed(context, "/login");
// 2. [A -> A]
// Navigator.pushReplacementNamed(context, "/login");
// 3. [A], 새 객체 생성 필요
// Navigator.pushNamedAndRemoveUntil(context, "/login", (route) => false);
// 4. [A] 이거는 history.back과 같습니다. 객체가 남아있습니다.
Navigator.pop(context);
},
child: Text("뒤로가기"),
style: ElevatedButton.styleFrom(
padding: EdgeInsets.symmetric(horizontal: 24.0, vertical: 12.0),
textStyle: TextStyle(fontSize: 16),
),
),
),
);
}
}

코드설명
1. AppBar
AppBar
는 상단에 표시되는 바입니다. 기본적으로 뒤로가기 아이콘이 자동으로 생성됩니다.title
속성에 "Home"이라는 텍스트를 넣어, 화면 상단에 제목을 표시합니다.
2.ElevatedButton
ElevatedButton
은 눌렀을 때 동작을 수행하는 버튼입니다. 이 버튼을 눌렀을 때 호출되는onPressed
함수에서 화면 이동 기능을 구현하고 있습니다.
3.Navigator.pop(context)
Navigator.pop()
은 현재 화면을 종료하고 이전 화면으로 돌아가는 기능을 합니다. Flutter의 네비게이션 시스템에서 이전에 쌓인 화면으로 돌아갈 때 사용됩니다.
- 예를 들어, 로그인 화면에서 홈 화면으로 이동했다면, 이 코드를 실행하면 다시 로그인 화면으로 돌아갑니다.
4.다양한 화면 이동 방법
- 코드 주석에는 여러 가지 네비게이션 방법이 설명되어 있습니다.
Navigator.pushNamed(context, "/login")
: 새로운 화면을 쌓고 현재 화면 위에 추가합니다. 이 경우 뒤로가기 버튼을 누르면 이전 화면으로 돌아갑니다.Navigator.pushReplacementNamed(context, "/login")
: 현재 화면을 대체하고 새로운 화면으로 이동합니다. 뒤로가기를 눌러도 이전 화면으로 돌아갈 수 없습니다.Navigator.pushNamedAndRemoveUntil(context, "/login", (route) => false)
: 특정 조건을 만족하는 경로까지 화면 스택을 모두 제거하고, 새로운 화면을 표시합니다.Navigator.pop(context)
: 이전 화면으로 돌아가는 기능으로, 웹 브라우저의history.back()
과 유사합니다.
Share article