Flutter

[Flutter] 33. Form 위젯

Song hyun 2024. 11. 8. 09:16
728x90
반응형

[Flutter] 33. Form 위젯

 

 


시나리오 코드

 

1. 기본 코드 - 이름, 이메일, 비밀번호 폼 작성하기

import 'package:flutter/material.dart';

void main(){
  runApp(MyApp8());
}

class MyApp8 extends StatefulWidget {
  const MyApp8({super.key});

  @override
  State<MyApp8> createState() => _MyApp8State();
}

class _MyApp8State extends State<MyApp8> {
  
  // Form 위젯 만들어보기
  
  final _formkey = GlobalKey<FormState>();
  String _name = '';
  String _email = '';
  String _password = '';
  String _errorMessage = '';
  
  // 멤버 함수 만들어보기
  void _submitForm(){
    // 유효성 검사
    // UI 상태 변경
    // ---> 통신 요청
  }
  
  
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      debugShowCheckedModeBanner: false,
      home: Scaffold(
        appBar: AppBar(
          title: Text('Form Example'),
        ),
        body: Container(
          padding: const EdgeInsets.all(16.0),
          // form 위젯은 위젯들을 구분할 수 있는 키가 필요하다.
          child: Form(
            child: Column(
              children: [
                TextFormField(
                  decoration: InputDecoration(
                    labelText: 'name',
                    errorStyle: TextStyle(color: Colors.blue, fontSize: 10)
                  ),
                  validator: (value){
                    if(value == null || value.isEmpty){
                      return '이름을 입력하세요';
                    }
                    return null;
                  },
                  // value 매개 변수 값이 null이 될 수 있다.
                  onSaved: (value){
                    // value! = 강제 null이 아니라고 명시
                    // 하지만 실제 null 값이 들어오면 터진다
                    _name = value!;
                  },
                ),
                TextFormField(
                  decoration: InputDecoration(
                      labelText: 'email',
                      errorStyle: TextStyle(color: Colors.blue, fontSize: 10)
                  ),
                  validator: (value){
                    if(value == null || value.isEmpty){
                      return '이메일을 입력하세요';
                    }
                    return null;
                  },
                  // value 매개 변수 값이 null이 될 수 있다.
                  onSaved: (value){
                    // value! = 강제 null이 아니라고 명시
                    // 하지만 실제 null 값이 들어오면 터진다
                    _email = value!;
                  },
                ),
                TextFormField(
                  decoration: InputDecoration(
                      labelText: 'password',
                      errorStyle: TextStyle(color: Colors.blue, fontSize: 10)
                  ),
                  validator: (value){
                    if(value == null || value.isEmpty){
                      return '비밀번호를 입력하세요';
                    }
                    return null;
                  },
                  // value 매개 변수 값이 null이 될 수 있다.
                  onSaved: (value){
                    // value! = 강제 null이 아니라고 명시
                    // 하지만 실제 null 값이 들어오면 터진다
                    _password = value!;
                  },
                ),
                const SizedBox(height: 20,),
                ElevatedButton(
                    onPressed: (){},
                    child: Text('Submit')
                ),
                const SizedBox(height: 20,),
                Text(_errorMessage, style: TextStyle(color: Colors.red))
              ],
            )
          ),
        ),
      )
    );
  }
}

 

 

 

2. 폼 제출 시 함수 실행하기

 ElebatedButton을 클릭하면 아래와 같이 _submitForm() 함수가 작동하는 것을 알 수 있다.

  ElevatedButton(
                    onPressed: (){
                      // 메서드 호출
                      _submitForm();
                    },
                    child: Text('Submit')
                ),
  // 멤버 함수 만들어보기
  void _submitForm(){
    print('11111111');
    // 유효성 검사
    // UI 상태 변경
    // ---> 통신 요청
  }

 

 

onPressed의 경우, 아래와 같이 파라미터와 실행부 없이 간단히 줄여 쓸 수도 있다.

 ElevatedButton(
                    onPressed: _submitForm,
                    child: Text('Submit')
                ),

 

 

 

3. 유효성 검사 하기

// 멤버 함수 만들어보기
  void _submitForm(){
    print('_formKey.currentState!.validate()');
    if(_formkey.currentState!.validate()){
      // TextFormField -> validator 호출 -> 모두 통과하면 true를 반환한다
      
      // 다음 단계 -> onSaved 메서드를 실행 시킨다.
      _formkey.currentState!.save(); // 각각의 formfield onSaved 메서드 호출 됨
      setState(() {
        _errorMessage = ''; // 상태 변경 처리
        // 변수 안에 값 확인
        print('_name : $_name');
        print('_email : $_email');
        print('_password : $_password');

        // 통신 요청
        http.get(~);
        http.post(~);
      });
    } else {
      setState(() {
        _errorMessage = '필수값들을 입력하시오';
      });
    }
  }
728x90
반응형