9. Flutter 수업- Android Studio로 loingapp 만들기

loingapp
홍윤's avatar
Oct 02, 2024
9. Flutter 수업- Android Studio로 loingapp 만들기

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 위젯을 렌더링합니다.
  • 이 부분에서 contextBuildContext 타입으로 자동으로 전달되며, 위젯 트리에서 현재 위젯의 위치와 관련된 정보를 제공합니다.

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), ), ), ], ), ); } }
notion image
  • 로그인 버튼 누르면
notion image
notion image
💡

코드설명

1.TextEditingController:

  • usernamepassword라는 두 개의 TextEditingController를 정의했습니다. 이 컨트롤러들은 각각 사용자 이름과 비밀번호를 입력받는 텍스트 필드를 제어하며, 입력된 데이터를 바인딩하는 역할을 합니다.

2.TextFormField:

  • 사용자 이름과 비밀번호를 입력받기 위한 두 개의 TextFormField가 있습니다. 각각의 필드에는 hintTextprefixIcon이 설정되어 있고, 테두리는 둥근 모서리로 되어 있습니다. obscureText 속성은 비밀번호 필드를 보호하여 입력된 텍스트를 보이지 않게 처리합니다.

3.ElevatedButton:

  • 로그인 버튼입니다. 버튼을 클릭하면 onPressed 함수가 호출됩니다. 이 함수에서 usernamepassword 필드에 입력된 값을 가져오고, 그 값을 출력한 뒤, 로그인 성공 시 다음 페이지(/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), ), ), ), ); } }
notion image
💡

코드설명

1. AppBar

  • AppBar는 상단에 표시되는 바입니다. 기본적으로 뒤로가기 아이콘이 자동으로 생성됩니다. title 속성에 "Home"이라는 텍스트를 넣어, 화면 상단에 제목을 표시합니다.

2.ElevatedButton

  • ElevatedButton은 눌렀을 때 동작을 수행하는 버튼입니다. 이 버튼을 눌렀을 때 호출되는 onPressed 함수에서 화면 이동 기능을 구현하고 있습니다.

3.Navigator.pop(context)

  • Navigator.pop()은 현재 화면을 종료하고 이전 화면으로 돌아가는 기능을 합니다. Flutter의 네비게이션 시스템에서 이전에 쌓인 화면으로 돌아갈 때 사용됩니다.
  • 예를 들어, 로그인 화면에서 홈 화면으로 이동했다면, 이 코드를 실행하면 다시 로그인 화면으로 돌아갑니다.

4.다양한 화면 이동 방법

  • 코드 주석에는 여러 가지 네비게이션 방법이 설명되어 있습니다.
      1. Navigator.pushNamed(context, "/login"): 새로운 화면을 쌓고 현재 화면 위에 추가합니다. 이 경우 뒤로가기 버튼을 누르면 이전 화면으로 돌아갑니다.
      1. Navigator.pushReplacementNamed(context, "/login"): 현재 화면을 대체하고 새로운 화면으로 이동합니다. 뒤로가기를 눌러도 이전 화면으로 돌아갈 수 없습니다.
      1. Navigator.pushNamedAndRemoveUntil(context, "/login", (route) => false): 특정 조건을 만족하는 경로까지 화면 스택을 모두 제거하고, 새로운 화면을 표시합니다.
      1. Navigator.pop(context): 이전 화면으로 돌아가는 기능으로, 웹 브라우저의 history.back()과 유사합니다.
Share article

Uni