2021/1/11 追記
こちらの記事が本記事の改善版になりますので参考にしてください。
Statelessのように使いたい
TextFieldウィジェットのイベント監視にはControllerを使って,Statefulにする必要があります。
ProviderパターンではできるだけStatefulWidgetを使わないようにしたいので,下記のようにしてGestureDetectorのonTapのように扱えるようにしました。
どなたかのお力になれば。。
class EventListeningTextField extends StatefulWidget {
EventListeningTextField({
this.onChanged,
this.onEditingCompleted,
this.initialValue,
this.inputDecoration,
});
Function(String) onChanged;
Function(String) onEditingCompleted;
String initialValue = '';
InputDecoration inputDecoration;
@override
_EventListeningTextFieldState createState() =>
_EventListeningTextFieldState(onChanged, onEditingCompleted, initialValue, inputDecoration);
}
class _EventListeningTextFieldState extends State<EventListeningTextField> {
_EventListeningTextFieldState(
this.onChanged,
this.onEditingCompleted,
this.initialValue,
this.inputDecoration,
);
Function(String) onChanged;
Function(String) onEditingCompleted;
String initialValue = '';
InputDecoration inputDecoration;
final _textEditingController = TextEditingController();
@override
void initState() {
_textEditingController.text = initialValue;
super.initState();
}
@override
Widget build(BuildContext context) {
return Container(
child: TextField(
controller: _textEditingController,
onChanged: onChanged,
onEditingComplete: () {
onEditingCompleted(_textEditingController.text);
},
onSubmitted: (String value) {
FocusScope.of(context).unfocus(); // キーボードを閉じる
},
decoration: inputDecoration,
),
);
}
}