child 속성값은 반드시 있어야한다. 왜냐하면 해당 child에 어떤 위젯이 폼 안에 위치할지 결정하기 때문이다.
물론 어떤 위젯이 들어가도 상관없다.
그리고 실제 Form 위젯 안에서 input값을 받을 위젯은 TextField가 아닌 Form이 붙은 TextFormField값이다.
TextField(decoration: InputDecoration(label: Text('Title')),),
TextField(decoration: InputDecoration(labelText: 'Title'),),
물론 위 속성들을 제외하고도 굉장히 많은 속상값을 설정해줄 수 있다.
그리도 해당 Validator에서는 만약 유효하지 않다면 String을 유효하다면 null값을 반환할 것이다.
매개변수로 작성된 value 부분은 FormField 값에 의해 들어온 값을 뜻한다.
또한 그냥 이렇게만 둔다면 작동하지 않고 추후 이 메서드를 trigger 해주는 부분도 따로 작성해주어야한다.
바로 key prop인데 이는 밑에서 따로 다루도록 하겠다.
dropDownFormField 역시 validate가 가능하긴 하나 잘 쓰이진 않는다.
대신 initial value를 자주 사용한다. 하지만 애석하게도 initalValue 이런식으로 속성값을 제공하진 않아서 일일이 만들어야한다는 단점이 존재한다.
또한 dropdown option을 클릭했을 때(onChanged) UI적으로 반영이 되야하므로 setState 메서드 또한 사용해 주어야한다.
Form 위젯에 해당하는 속성값인 key는 Form 위젯 밑(child
)에 있는 모든 위젯에 접근이 가능하다. 이는 곧 모든 validate에 접근이 가능하다는 뜻이다.
또한 앞서 포스팅한 global Key를 부여해야한다.
하지만 여기서는 FormWidget과 함께 쓰이므로 GlobalKey에 generic 한 타입을 지정해줘야하는데
바로 formState를 넣어주면 된다.
즉, 위와 같이 GlobalKey를 생성하여 Form 위젯의 key prop에 넣주면 이제 GlobalKey가 Form widget에 연결되었다고 볼 수 있는데 이를 이용하여 validate 함수를 실행하면 된다.
!
키워드를 사용하여 만드시 해당 속성값이 존재한다고 지정해준다. 왜 장담할 수 있나? => 앞서 말했듯 해당 메서드는 validate를 사용할 때 사용하는 메서드라 하였고 validate를 실행할 땐 해당 속성값은 반드시 존재하기 때문이다.entries 속성값은 원래 Map 타입의 데이터라면 for loop을 돌며 데이터를 꺼내올 수 없지만 이 entries라는 속성을 통해 그게 가능하도록 해준다.
즉, entries는 우리에게 Iterable한 값을 넘겨준다.