Flutter 로그 인 페이지 개발

비 즈 니스 논리
로그 인 점프 를 보 여주 기 위해 분류 탐색 에서 간단 한 단 추 를 누 르 고 로그 인 페이지 로 이동 합 니 다.실제 앱 에 서 는 로그 인해 야 볼 수 있 는 동작 을 터치 한 후 로그 인 화면 으로 이동 하 는 경우 가 많 습 니 다.
레이아웃 분석

화면 은 위의 그림 에서 보 듯 이 화면 에서 볼 때 전체 내용 구역 이 가운데 에 있 고 내용 의 구 조 는 간단 한 열 식 구조 로 상단 의 로고(보통 App 아이콘)를 포함 하고 아래 는 두 텍스트 입력 상자 이 며 마지막 은 로그 인 버튼 입 니 다.전체 레이아웃 이 간단 합 니 다.Center 에 Column 을 삽입 하여 열 레이아웃 을 하면 됩 니 다.
그림 원형 재단
Flutter 에서 그림 원형 재단 을 실시 하 는 방법 은 두 가지 가 있 는데 하 나 는 바깥쪽 용 기 를 사용 하고 정사각형 을 원형 으로 재단 하면 된다.둘 째 는 내 장 된 CircleAvatar 를 사용 하 는 것 이다.그러나 이름 상 CircleAvatar 는 두상 에 사용 되 기 때문에 용기 의 것 을 사용 하여 원형 재단 을 실현 한다.원형 그림 을 가 져 오 는 방법getRoundImage 는 그림 자원 의 이름과 정사각형 변 의 길 이 를 전달 합 니 다.코드 는 다음 과 같 습 니 다.

Widget _getRoundImage(String imageName, double size) {
    return Container(
      width: size,
      height: size,
      clipBehavior: Clip.antiAlias,
      decoration: BoxDecoration(
        borderRadius: BorderRadius.all(Radius.circular(size / 2)),
      ),
      child: Image.asset(
        imageName,
        fit: BoxFit.fitWidth,
      ),
    );
  }
여기에 박스 데 코 레이 션 을 사용 해 테 두 리 를 원형의 테 두 리 를,반경 은 테 두 리 를 절반 으로 설정 하면 테 두 리 는 원형의 효 과 를 볼 수 있다.단,하나의 속성 을 추가 로 설정 해 야 합 니 다.이것 은 클립 Behavior 입 니 다.이것 은 가장자리 재단 형식 입 니 다.기본적으로 재단 하지 않 습 니 다.여 기 는 Clip.antiAlias(톱니 저항)방식 으로 재단 을 했 습 니 다.이런 방식 의 재단 효과 가 가장 좋 지만 자원 을 더 소모 합 니 다.다른 재단 방식 은 다음 과 같 습 니 다.
  • Clip.hardEdge:이름 부터 알 수 있 듯 이 이런 방식 은 매우 거 칠 지만 재단 의 효율 이 가장 빠르다
  • Clip.antiAlias SaveLayer:가장 정교 한 재단 이지 만 매우 느 려 서 사용 하 는 것 을 권장 하지 않 습 니 다
  • 4.567917.Clip.none:기본 값 입 니 다.내용 영역 이 용기 경 계 를 초과 하지 않 으 면 재단 하지 않 습 니 다.내용 이 경 계 를 넘 으 면 내용 이 넘 치지 않도록 다른 재단 방식 을 사용 해 야 합 니 다.
    원형 평면 버튼
    여기 서 언급 해 야 할 것 은 Flutter 2.0 이전의 평평 한 버튼 은 FlatButton 으로 사용 하기에 간단 하지만 만족 하지 않 는 경우 가 많아 2.0 이후 TextButton 대 체 를 도입 했다.TextButton 은 단추 스타일 을 장식 하기 위해 스타일 을 하나 더 만 들 었 습 니 다.구체 적 으로 는 공식 문 서 를 볼 수 있다.여기 서 우리 의 단 추 는 배경 색 을 테마 색 으로 설정 한 다음 단추 의 텍스트 색 을 흰색 으로 하고 원 각 으로 잘라 야 하기 때문에 Container 의 경계 원호 로 이 루어 집 니 다.주의해 야 할 것 은 기본 단추 의 너 비 는 내용 에 따라 이 루어 지기 때문에 단추 가 화면 을 가득 채 우기 위해 Container 의 너 비 를 double.infinity 로 설정 하 였 습 니 다.코드 는 다음 과 같다.
    
    Widget _getLoginButton() {
        return Container(
          height: 50,
          width: double.infinity,
          margin: EdgeInsets.all(10),
          decoration: BoxDecoration(
            color: Theme.of(context).primaryColor,
            borderRadius: BorderRadius.circular(4.0),
          ),
          child: TextButton(
            style: ButtonStyle(
              foregroundColor: MaterialStateProperty.all<Color>(Colors.white),
              backgroundColor:
                  MaterialStateProperty.all<Color>(Theme.of(context).primaryColor),
            ),
            child: Text(
              '  ',
            ),
            onPressed: () {
              print(
                  'Login: username=${_username.trim()}, password=${_password.trim()}');
            },
          ),
        );
      }
    
    단 추 를 누 르 면 이벤트 가 onPressed 로 바 뀌 었 습 니 다.폼 의 내용 만 간단하게 인쇄 되 었 습 니 다.
    TextField 텍스트 상자
    TextField 는 Flutter 가 제공 하 는 텍스트 입력 상자 로 TextField 의 속성 이 매우 많 습 니 다.자주 사용 하 는 속성 은 다음 과 같 습 니 다.
  • keyboard Type:키보드 유형 은 숫자,자모,전화번호,메 일,날짜 등 여러 가지 방식 으로 지정 할 수 있 으 며 폼 내용 과 일치 하 는 키보드 유형 을 통 해 입력 효율 을 제공 하여 사용자 체험 을 개선 할 수 있다
  • controller:TextEditingController 대상,TextEditingController 는 주로 텍스트 상자 의 초기 값 을 제어 하고 내용 을 지 우 는 데 사 용 됩 니 다
  • obscureText:입력 내용 을 숨 길 필요 가 있 는 지,true 라면 입력 내용 은 원점 으로 표시 되 며,보통 비밀번호 로 표 시 됩 니 다
  • decoration:텍스트 상자 의 장식,속성 도 많 습 니 다.사전 아이콘,테두리 유형,뒷 구성 요소 등 여러 가지 속성 을 지정 할 수 있 기 때문에 decoration 을 통 해 원 하 는 텍스트 상자 스타일 을 얻 을 수 있 습 니 다
  • 4.567917.focusNode:초점 점 은 이 를 통 해 텍스트 상자 가 초점 을 얻 는 지 여 부 를 제어 하여 이전 다음 입력 제어 와 유사 합 니 다
  • onChanged:입력 값 이 이벤트 의 반전 을 바 꾸 고 보통 이 방법 으로 양 방향 연결 을 실현 합 니 다.
  • 이 사례 에서 우 리 는 입력 내용 의 유형 을 나타 내 는 사전 아이콘 을 사용 했다.예 를 들 어 핸드폰 아이콘 을 사용 하면 핸드폰 번 호 를 입력 하고 자 물 쇠 를 사용 하면 비밀 번 호 를 나타 낸다.내용 을 입력 한 후 내용 을 지 우려 면 클릭 할 수 있 는 Offstage 를 백 엔 드 구성 요소 로 사 용 했 습 니 다.Offstage 구성 요 소 는 하나의 속성 offsstage 를 통 해 구성 요소 가 표시 되 는 지 여 부 를 제어 합 니 다.내용 이 없 을 때 숨 기 고 입력 내용 이 있 을 때 표시 할 수 있 습 니 다.
    코드 재 활용 성 을 높이 기 위해 일반적인 텍스트 상 자 를 가 져 오 는 방법 을 사 용 했 습 니 다.여 기 는 주로 Container 패 키 지 를 사용 하여 여백 과 텍스트 상자 의 구분자 선 을 제어 합 니 다.
    
    Widget _getInputTextField(
        TextInputType keyboardType, {
        FocusNode focusNode,
        controller: TextEditingController,
        onChanged: Function,
        InputDecoration decoration,
        bool obscureText = false,
        height = 50.0,
      }) {
        return Container(
          height: height,
          margin: EdgeInsets.all(10.0),
          child: Column(
            children: [
              TextField(
                keyboardType: keyboardType,
                focusNode: focusNode,
                obscureText: obscureText,
                controller: controller,
                decoration: decoration,
                onChanged: onChanged,
              ),
              Divider(
                height: 1.0,
                color: Colors.grey[400],
              ),
            ],
          ),
        );
      }
    
    전체 코드
    
    class _LoginPageState extends State<LoginPage> {
      //TextEditingController     text        
      TextEditingController _usernameController = TextEditingController();
      TextEditingController _passwordController = TextEditingController();
      String _username = '', _password = '';
    
      @override
      Widget build(BuildContext context) {
        return Scaffold(
          appBar: AppBar(
            title: Text('  '),
            brightness: Brightness.dark,
          ),
          body: Center(
            child: Column(
              crossAxisAlignment: CrossAxisAlignment.center,
              mainAxisAlignment: MainAxisAlignment.center,
              children: <Widget>[
                _getRoundImage('images/logo.png', 100.0),
                SizedBox(
                  height: 60,
                ),
                _getUsernameInput(),
                _getPasswordInput(),
                SizedBox(
                  height: 10,
                ),
                _getLoginButton(),
              ],
            ),
          ),
        );
      }
    
      Widget _getUsernameInput() {
        return _getInputTextField(
          TextInputType.number,
          controller: _usernameController,
          decoration: InputDecoration(
            hintText: "     ",
            icon: Icon(
              Icons.mobile_friendly_rounded,
              size: 20.0,
            ),
            border: InputBorder.none,
            //   GestureDetector       
            suffixIcon: GestureDetector(
              child: Offstage(
                child: Icon(Icons.clear),
                offstage: _username == '',
              ),
              //         
              onTap: () {
                this.setState(() {
                  _username = '';
                  _usernameController.clear();
                });
              },
            ),
          ),
          //   onChanged       
          onChanged: (value) {
            this.setState(() {
              _username = value;
            });
          },
        );
      }
    
      Widget _getPasswordInput() {
        return _getInputTextField(
          TextInputType.text,
          obscureText: true,
          controller: _passwordController,
          decoration: InputDecoration(
            hintText: "    ",
            icon: Icon(
              Icons.lock_open,
              size: 20.0,
            ),
            suffixIcon: GestureDetector(
              child: Offstage(
                child: Icon(Icons.clear),
                offstage: _password == '',
              ),
              onTap: () {
                this.setState(() {
                  _password = '';
                  _passwordController.clear();
                });
              },
            ),
            border: InputBorder.none,
          ),
          onChanged: (value) {
            this.setState(() {
              _password = value;
            });
          },
        );
      }
    
      //          
    
    }
    
    페이지 이동
    상단 의 로그 인 버튼 에 클릭 이벤트 가 추가 되 었 습 니 다.클릭 한 후에 로그 인 페이지 로 넘 어 갑 니 다.버튼 의 응답 코드 는 다음 과 같 습 니 다.이것 은 페이지 를 뛰 어 넘 는 가장 간단 한 방식 이다.Navigator 네 비게 이 션 의 push 방법 으로 페이지 를 뛰 어 넘 는 것 을 실현 하고 나중에 경로 로 페이지 를 뛰 어 넘 는 방법 을 소개 할 것 이다.그런 방식 이 더욱 우아 하 다.
    
    //...
    onPressed: () {
      Navigator.of(context).push(
        MaterialPageRoute(builder: (context) => LoginPage()),
      );
    },
    //...
    
    총결산
    코드 로 볼 때 기능 은 실현 되 었 지만 사용자 이름과 비밀 번 호 를 구축 하 는 코드 는 매우 비슷 합 니 다.코드 재 활용 율 을 높이 고 더욱 통용 되 는 폼 구성 요 소 를 구축 할 방법 이 있 습 니까?다음 편 에서 우 리 는 어떻게 포장 하 는 지 소개 할 것 이다.
    이상 은 Flutter 가 로그 인 페이지 를 개발 하 는 상세 한 내용 입 니 다.Flutter 개발 로그 인 페이지 에 관 한 자 료 는 저희 의 다른 관련 글 을 주목 하 세 요!

    좋은 웹페이지 즐겨찾기