Flutter 텍스트 입력 상자 구성 요 소 를 어떻게 밀봉 합 니까?

UI 구성 요소 패키지 고려 사항
UI 구성 요 소 를 패키지 하려 면 다음 세 가 지 를 고려 해 야 합 니 다.
  • 인 터 페 이 스 는 어떻게 정의 합 니까?즉,구성 요소 가 어떤 입력 파 라 메 터 를 받 아서 구성 요소 의 외관 과 행 위 를 제어 합 니까?
  • 업무 와 분리:UI 구성 요 소 는 인터페이스 만 책임 지고 업 무 를 책임 지지 않 으 며 구체 적 인 업 무 는 업무 층 에서 완성 해 야 한다.
  • 간단 하고 사용 하기 쉽다.UI 구성 요소 이기 때문에 가능 한 한 간단 하고 사용 하기 쉬 우 며 사용자 가 신속하게 시작 할 수 있 도록 해 야 한다.
  • 텍스트 입력 상자 인터페이스 정의
    먼저 이전 텍스트 상 자 를 사용 한 코드 를 살 펴 보 겠 습 니 다.여 기 는 실제 적 으로 하나의 함 수 를 호출 하여 새로운 구성 요 소 를 되 돌려 주 었 을 뿐 입 니 다.사용자 이름,비밀 번 호 는 구성원 속성 을 사 용 했 기 때문에 서로 다른 구성원 속성 에 따라 다른 행 위 를 설정 해 야 합 니 다.주로 다음 과 같 습 니 다.
  • 텍스트 상자 의 장식 이 다 릅 니 다.자리 표시 자,사전 아이콘 을 포함 하고 나중에 아이콘 을 설치 하 는 행 위 는 구성원 속성 과 서로 다른 TextEditingCongroller 를 연결 합 니 다.
  • onChanged 사건 의 리 셋 내용 이 다 릅 니 다.
  • 키보드 유형 과 입력 내용 을 숨 길 지 여부 가 다 릅 니 다.
  • 대응 하 는 폼 의 필드 가 다 릅 니 다.
  • 
    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;
            });
          },
        );
      }
    
    실제 차이 가 발생 하 는 이 유 는 멤버 속성 간 의 차이 가 다 르 기 때문에 멤버 속성 을 계속 사용 하 는 방식 이 라면 이 문 제 를 해결 할 수 없다.이때 우 리 는 전체 폼 을 하나의 Map 에 넣 는 것 을 고려 할 수 있 습 니 다.Map 에 서로 다른 필드 에 대응 하 는 차별 화 속성 을 설정 한 다음 에 통용 되 는 인 터 페 이 스 를 만 들 수 있 습 니 다.우 리 는 포 장 된 구성 요소 인 터 페 이 스 를 정의 할 수 있 습 니 다.
    
    Widget _getInputTextFieldNew(
        String formKey,
        String value, {
        TextInputType keyboardType = TextInputType.text,
        FocusNode focusNode,
        controller: TextEditingController,
        onChanged: Function,
        String hintText,
        IconData prefixIcon,
        onClear: Function,
        bool obscureText = false,
        height = 50.0,
        margin = 10.0,
      }) {
      //......
    }
    
    새로 추 가 된 매개 변 수 는 다음 과 같 습 니 다.
  • formKey:텍스트 상자 가 폼 맵 의 어떤 키 에 대응 하 는 지 표시 합 니 다.
  • value:현재 폼 의 값 은 제거 단 추 를 표시 할 지 여 부 를 제어 하 는 데 사 용 됩 니 다
  • onClear:오른쪽 제거 단 추 를 정의 하 는 행동 응답
  • onChanged:입력 내용 변 비 반전
  • 코드 구현
    추출 후의 코드 는 업무 페이지 와 무관 하기 때문에 추출 코드 가 필요 합 니 다.lib 디 렉 터 리 에 components 디 렉 터 리 를 추가 하여 form 을 추가 합 니 다.util.dart 파일 은 일반적인 폼 구성 요 소 를 저장 하 는 데 사 용 됩 니 다.실 현 된 코드 는 다음 과 같다.
    
    class FormUtil {
      static Widget textField(
        String formKey,
        String value, {
        TextInputType keyboardType = TextInputType.text,
        FocusNode focusNode,
        controller: TextEditingController,
        onChanged: Function,
        String hintText,
        IconData prefixIcon,
        onClear: Function,
        bool obscureText = false,
        height = 50.0,
        margin = 10.0,
      }) {
        return Container(
          height: height,
          margin: EdgeInsets.all(margin),
          child: Column(
            children: [
              TextField(
                  keyboardType: keyboardType,
                  focusNode: focusNode,
                  obscureText: obscureText,
                  controller: controller,
                  decoration: InputDecoration(
                    hintText: hintText,
                    icon: Icon(
                      prefixIcon,
                      size: 20.0,
                    ),
                    border: InputBorder.none,
                    suffixIcon: GestureDetector(
                      child: Offstage(
                        child: Icon(Icons.clear),
                        offstage: value == null || value == '',
                      ),
                      onTap: () {
                        onClear(formKey);
                      },
                    ),
                  ),
                  onChanged: (value) {
                    onChanged(formKey, value);
                  }),
              Divider(
                height: 1.0,
                color: Colors.grey[400],
              ),
            ],
          ),
        );
      }
    }
    
    
    구성 요소 사용
    우선 맵 을 사용 하여 현재 페이지 의 폼 내용 을 정의 하여 서로 다른 폼 필드 의 표현 형식 을 제어 합 니 다.
    
    Map<String, Map<String, Object>> _formData = {
        'username': {
          'value': '',
          'controller': TextEditingController(),
          'obsecure': false,
        },
        'password': {
          'value': '',
          'controller': TextEditingController(),
          'obsecure': true,
        },
      };
    
    그 다음은 통 일 된 텍스트 상자 onChanged 와 onClear 방법 을 정의 하고 로 대응 합 니 다.handle TextFieldChanged 와handleClear。formKey 리 턴 필드 를 통 해 대응 하 는 업데이트 가능formData 의 내용.여기 서 as 용법 을 사용 하여 Object 를 TextEditingController 로 변환 하 는 데 사용 합 니 다.이 전환 은 Object 에 대응 하 는 형식 이 TextEditing Controller 라면 성공 적 으로 전환 할 수 있 고 뒤의 clear()방법 도 정상적으로 실행 할 수 있 습 니 다.그러나 null 이 라면 이 럴 때 clear()방법 을 실행 하면 빈 포인터 가 이상 합 니 다.따라서 전환 결과 뒤에 물음 표를 붙 였 습 니 다.이 는 null 뒤의 방법 이 실행 되 지 않 으 면 빈 포인터 이상 이 나타 나 지 않 는 다 는 뜻 입 니 다.Flutter 2.0 이 도입 한 null safety 특성 입 니 다.사실 이 필 터 는 PHP 7 에서 Swift 언어 가 이미 응용 되 었 다.
    
    _handleTextFieldChanged(String formKey, String value) {
        this.setState(() {
          _formData[formKey]['value'] = value;
        });
      }
    
      _handleClear(String formKey) {
        this.setState(() {
          _formData[formKey]['value'] = '';
          (_formData[formKey]['controller'] as TextEditingController)?.clear();
        });
      }
    
    다음은 textField 를 사용 하 는 곳 에서 FormUtil.textField 방법 을 사용 하여 봉 인 된 텍스트 상 자 를 직접 사용 합 니 다.
    
    //...
    FormUtil.textField(
        'username',
        _formData['username']['value'],
        controller: _formData['username']['controller'],
        hintText: '      ',
        prefixIcon: Icons.mobile_friendly,
        onChanged: _handleTextFieldChanged,
        onClear: _handleClear,
      ),
    FormUtil.textField(
        'password',
        _formData['password']['value'],
        controller: _formData['password']['controller'],
        obscureText: true,
        hintText: '     ',
        prefixIcon: Icons.lock_open,
        onChanged: _handleTextFieldChanged,
        onClear: _handleClear,
    ),
    //...
    
    username 과 password 두 폼 필드 를 재 활용 한 것 을 볼 수 있 습 니 다handle TextFieldChanged 와handleClear。전체 코드 길이 도 50%가까이 줄 었 고 포 장 된 FormUtil.textField 텍스트 상자 도 다른 폼 페이지 에 사용 할 수 있 으 며 전체 코드 의 유지 성과 재 활용 성 이 전편 에 비해 크게 향상 되 었 습 니 다.
    구덩이 밟 기 기록
    텍스트 상 자 를 봉인 할 때 GesureDetector 의 onTap 속성 에 onClear 함 수 를 직접 복사 한 결과 입력 할 때마다 onClear 가 텍스트 상자 내용 을 자동 으로 비 웁 니 다.나중에 실제 적 으로 반전 함 수 를 전달 해 야 한 다 는 것 을 알 게 되 었 습 니 다.다음은 두 가지 방식 의 차이 점 을 보 여 주 었 습 니 다.
    
    //...
    //     
    onTap:onClear,
    //...
    
    //...
    //     
    onTap:() {
      onClear(formKey);
    },
    //...
    
    총결산
    패 키 징 UI 구성 요 소 는 실제 개발 과정 에서 흔히 볼 수 있 습 니 다.일반적으로 디자인 원 고 를 볼 때 먼저 디자인 원 고 를 여러 구성 요소 로 나 눈 다음 에 그 중의 일부 구성 요소 가 다른 장소 에서 도 사용 되 는 지 고려 합 니 다.사용 가능 하 다 면 포장 을 고려 해 보 세 요.패 키 징 할 때 대외 인터페이스 파 라 메 터 를 고려 한 다음 에 UI 구성 요소 가 업무 와 관련 되 지 않도록 주의 한 다음 에 가능 한 한 간편 하 게(예 를 들 어 기본 값 이 있 고 필수 파 라 메 터 를 줄 이 는 것).물론 회사 가 처음부터 제품,디자인,개발 과 함께 구성 요 소 를 정할 수 있다 면 미리 포장 하면 뒤의 개발 효율 이 더욱 높 아 질 것 이다.그러나 이것 은 프로젝트 시간의 긴급 정도 에 달 려 있 고 시간 이 충분 하 다 면 이렇게 고려 할 수 있다.
    이상 은 Flutter 가 텍스트 입력 상 자 를 어떻게 밀봉 하 는 지 에 대한 상세 한 내용 입 니 다.Flutter 패 키 징 텍스트 입력 상자 에 관 한 자 료 는 다른 관련 글 에 주목 하 십시오!

    좋은 웹페이지 즐겨찾기