본문 바로가기

Flutter

[Flutter] 로그인 화면 예제

728x90

 

 

Flutter 언어로 로그인화면을 구현해보겠습니다. 

Flutter 는 ios 와 android 를 동시에 구현할 수 있는 언어입니다. 

때문에 빠른 개발이 필요시 많이 사용하게되는데요 . 오늘은 로그인 페이지를 구현해 보겠습니다 .

 

 

flutter는 

widget 마다 함수로 나눠주는 것이 좋다고합니다 .  가독성면에서도 좋습니다. 

login() 부분은 서버와 통신을 하는 부분이라 각자 알맞게 사용하시면 될거같습니다.~

 

class LoginPage extends StatefulWidget {
  LoginPage({Key? key}) : super(key: key);

  @override
  _LoginPageState createState() => _LoginPageState();
}

class _LoginPageState extends State<LoginPage> {
  final idTextController = TextEditingController();
  final passwordTextController = TextEditingController();

  FocusNode idFocus = FocusNode();
  FocusNode passwordFocus = FocusNode();
  final _navService = GetIt.I<NavigationService>();

  @override
  Widget build(BuildContext context) {
    return CustomScaffold(
      child: Center(
        child: ListView(
          shrinkWrap: true,
          padding: EdgeInsets.symmetric(horizontal: 16),
          children: <Widget>[
            logo(),
            id(),
            password(),
            SizedBox(height: 50),
            button(),
          ],
        ),
      ),
    );
  }

  @override
  void initState() {
    super.initState();

    idFocus.requestFocus();
  }

  Widget logo() => Container(
        child: Image.asset(
          'assets/logo.png',
          width: 96,
          height: 47,
        ),
      );

  Widget id() => Container(
        margin: EdgeInsets.only(top: 70),
        height: 53,
        child: TextField(
          controller: idTextController,
          onSubmitted: (_) {
            passwordFocus.requestFocus();
          },
          focusNode: idFocus,
          decoration: InputDecoration(
            border: OutlineInputBorder(
              borderRadius: BorderRadius.circular(8.0),
            ),
            labelText: '아이디',
          ),
        ),
      );

  Widget password() => Container(
        margin: EdgeInsets.only(top: 15),
        height: 53,
        child: TextField(
          controller: passwordTextController,
          focusNode: passwordFocus,
          obscureText: true,
          decoration: InputDecoration(
            border: OutlineInputBorder(
              borderRadius: BorderRadius.circular(8.0),
            ),
            labelText: '비밀번호',
          ),
        ),
      );

  Widget button() => Container(
        margin: EdgeInsets.only(top: 15),
        height: 53,
        child: ElevatedButton(
          onPressed: () => login(),
          style: ButtonStyle(
            backgroundColor: MaterialStateProperty.all(
              Color(0xFF2C75F5),
            ),
          ),
          child: Text(
            "로그인",
            style: TextStyle(
              fontSize: 14,
              color: Colors.white,
              fontWeight: FontWeight.bold,
            ),
          ),
        ),
      );

  @override
  void dispose() {
    idTextController.dispose();
    passwordTextController.dispose();
    super.dispose();
  }

  login() async {
  ////요 부분은 데이터 통신을 위한 부분이라 빼실거 빼도 됩니다 . 
    if (idTextController != null && passwordTextController != null) {
      RequestLoginModel requestLoginModel = RequestLoginModel(
        email: idTextController.text,
        password: HashUtil.hash256(passwordTextController.text),
      );

      ResponseLoginModel result =
          await Client.create().login(requestLoginModel);

      if (result.result != false) {
        Client.token = result.token;
        _navService.navigateAndClear(RouteNames.Home);
      }
    }
  }
}

 

 

저도 Flutter 처음 써보네요 ~ 

좋은방법있으면 댓글 부탁드립니다 . 감사합니다 .