一番下に入力フォームを作ります。入力フォームはTextField
というウィジットで簡単に作れます。
ListView
とTextField
を縦並びにしたいのでこの二つをColumn
に追加しましょう。
ここで便利機能の紹介です。
まず👇の画像の場所にカーソルを合わせて、
option + enter
を押すと、
選択肢が出てくるのでWrap with Column
をクリック。ListView
がColumn
の子になり、children
の中の一つになりました。
これを「ListView
をColumn
でラップした」と言います。
child: Column(
children: [
ListView.builder(
itemCount: todoList.length,
itemBuilder: (context, index) {
return ListTile(
title: Text(todoList[index]),
leading: Radio<bool?>(
value: false,
groupValue: null,
onChanged: (bool? value) {
clickDone(index);
},
),
);
},
),
],
),
また、ListView
をColumn
の中で使うときは高さを指定してあげないといけないというルールがあります。
なので、ListView
をExpanded
でラップしましょう。操作は先ほどと同じです。
こうすることで、今回の場合残りの高さ全てがListView
に割り当てられ、高さが明確になります。
child: Column(
children: [
Expanded(
child: ListView.builder(
itemCount: todoList.length,
itemBuilder: (context, index) {
return ListTile(
title: Text(todoList[index]),
leading: Radio<bool?>(
value: false,
groupValue: null,
onChanged: (bool? value) {
clickDone(index);
},
),
);
},
),
),
],
),
ではColumn
の中にTextField
も追加しましょう。
),
SafeArea(
child: Padding(
padding:
const EdgeInsets.symmetric(horizontal: 16, vertical: 8),
child: TextField(),
),
),
],
変更後: 画面下部にTextField
ができているはずです👇
次にTextFieldの横に送信ボタンを作成します。今回ボタンはIconButton
を使って作成します。
TextField
とIconButton
を横並びにしたいのでまずはTextField
をRow
でラップしましょう。
child: Row(
children: [
TextField(),
],
),
先ほどと同じで、Rowの中でTextFieldを使うときは横幅を設定してあげないといけないので、TextFieldをExpanded
でラップしましょう。
child: Row(
children: [
Expanded(
child: TextField(),
),
],
),
そうしたらRow
にIconButton
を追加しましょう。onPressed
プロパティは一旦null
を入れておきます。
child: Row(
children: [
Expanded(
child: TextField(),
),
IconButton(
icon: Icon(Icons.send),
color: Colors.blue,
onPressed: null,
)
],
),
変更後: TextFieldの右横に送信ボタンが表示されているはずです👇
では送信ボタンがタップされた時に行いたい処理を関数にしてonPressed
に設定しましょう。
今回はまず、todoList
に新しいTodo
という文字列を追加する処理を書いてみましょう。画面の更新をするためにsetState
の中に書くことも忘れずに。
}
void sendTodo() {
setState(() {
todoList.add('新しいTodo');
});
}
void clickDone(int index) {
...
}
そして今作った関数sendTodo
をonPressed
プロパティに設定しましょう。
IconButton(
icon: Icon(Icons.send),
color: Colors.blue,
onPressed: sendTodo,
)
変更後: 送信ボタンをタップでリストに追加されるようになっているはずです👇
TextField
に入力された文字列をtodoList
に保存したいです。そのために、TextField
をTextEditingController
の管理下におきましょう。
まずTextEditingContoller
をインスタンス化しましょう。
class _MyHomePageState extends State<MyHomePage> {
List<String> todoList = ['ボールペンを買う', '本を読む', '電話をする'];
TextEditingController controller = TextEditingController();
Widget build(BuildContext context) {
...
}
今インスタンス化したcontoller
をTextField
の controller
プロパティに設定しましょう。
Expanded(
child: TextField(controller: controller),
),
これでTextField
をcontroller
で管理することができるようになりました。
ではこれを使ってTextField
に入力された文字列をリストに追加できるように処理を書き換えましょう。
void sendTodo() {
setState(() {
todoList.add(controller.text);
controller.clear();
});
}
変更後: 👇完成!!!
これにて完成です、お疲れ様でした。
今は空の文字列でもリストに追加されてしまいます。
空の文字列Todoがリストに登録されないようにしてみてください。