FormField와 FormFieldState를 상속하여 자체 입력 필드를 만드는 방법
세 줄로
FormField
, FormFieldState
)의 메소드를 활용하면 폼의 구현이 편해지기 때문에 좋았습니다 자체 입력 필드의 예
표시
탭시
값 입력
입력 완료
구현 포인트
1. FormField 빌더에서 입력 필드 조립
FormField
에서 builder
에 입력된 값을 표시하는 방법을 조립합니다. InputDecorator
로 표시됩니다. custom_form_field.dart#L27-L46
builder: (FormFieldState<String> field) {
final effectiveDecoration = decoration.applyDefaults(
Theme.of(field.context).inputDecorationTheme,
);
return InputDecorator(
decoration: effectiveDecoration.copyWith(
errorText: field.errorText,
),
isEmpty: value?.isEmpty ?? true,
child: Padding(
padding: const EdgeInsets.only(right: 6),
child: Text(
value ?? '',
maxLines: 1,
overflow: TextOverflow.ellipsis,
),
),
);
},
2. FormFieldState의 build에서 부모 클래스의 super.build를 호출하고 GestureDetector에서 탭을 감지합니다.
super.build(context)
를 건네줍니다 custom_form_field.dart # L67-L74
@override
Widget build(BuildContext context) {
return GestureDetector(
behavior: HitTestBehavior.opaque,
onTap: () => _handleTap(context),
child: super.build(context),
);
}
3. FormFieldState에서 탭한 후 입력 필드를 조립합니다.
GestureDetector
의 onTap
에 반응하여 표시 할 자체 입력 필드를 조립합니다 showModalBottomSheet
에서 iOS 스타일의 반모달 입력 영역을 표현하고 거기에 입력 전용 TextField
을 배치했습니다.custom_form_field.dart # L76-L99
void _handleTap(BuildContext context) {
FocusScope.of(context).unfocus();
final initText = widget.initialValue ?? '';
_textChangedNotifier.value = initText;
_textController.text = initText;
showModalBottomSheet<String>(
context: context,
isScrollControlled: true,
shape: const RoundedRectangleBorder(
borderRadius: BorderRadius.only(
topLeft: Radius.circular(32),
topRight: Radius.circular(32),
),
),
builder: _textFieldModalSheet,
).whenComplete(() {
// NOTE: 完了するボタンを押さずに選択画面を閉じた場合は選択前に戻す
if (!_isTapDoneButton) {
super.reset();
super.save();
}
});
}
4. FormFieldState 상태 관리 메소드를 사용하여 입력 값을 제어합니다.
FormFieldState
에는 입력 값의 상태를 제어하는 몇 가지 메소드가 있습니다 custom_form_field.dart#L123-L147
ValueListenableBuilder<String>(
valueListenable: _textChangedNotifier,
builder: (context, editingText, __) {
final enableDoneButton =
editingText.characters.length <= widget.maxLength;
return FlatButton(
textTheme: ButtonTextTheme.primary,
child: Text(
'完了する',
style: TextStyle(
fontWeight: enableDoneButton
? FontWeight.bold
: FontWeight.normal,
),
),
onPressed: enableDoneButton
? () {
_isTapDoneButton = true;
super.setValue(editingText);
super.save();
FocusScope.of(context).unfocus();
Navigator.pop(context);
}
: null,
);
},
참고
Reference
이 문제에 관하여(FormField와 FormFieldState를 상속하여 자체 입력 필드를 만드는 방법), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/masashi-sutou/items/3ccf3d9732aa64b86272텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)