Todoの情報をクラス内で使用できるように変数として管理する。(インスタンス変数)
以下のように、String型が入る配列todoItems
を定義します。
class _MyHomePageState extends State<MyHomePage> {
List<String> todoItems = ['ボールペンを買う', '本を読む', '電話をする'];
Widget build(BuildContext context) {
...
}
そうしたら、今作ったインスタンス変数の情報からListView
の中身を作ります。
todoItems.length
で配列の要素の数を、todoItems[index]
でindex番目の要素を取得できます。
child: ListView.builder(
itemCount: todoItems.length,
itemBuilder: (context, index) {
return ListTile(
title: Text(todoItems[index]),
leading: Radio<bool?>(value: false, groupValue: null, onChanged: null),
);
},
),
変更後: 配列todoItems
の情報からリストが作られているはずです👇
では次に、「ボタンをクリックした時の処理」を担当するメソッドを用意します。
このメソッドは「配列の何番目がクリックされたのか」というint型の情報を必要とします。
やりたいことは、「配列todoItems
のタップされた行番目の要素の削除」です。
以下のように書きます。
void clickDone(int index) {
todoItems.removeAt(index);
}
}
これは、
「戻り値なしのメソッドclickDone
を定義した。引数としてint型の値を要求し、それをindex
と呼ぶ。」
という意味です。
次に、今設定したclickDone
をRadioボタンのonChanged
プロパティに設定しましょう。こうすることで、RadioボタンがタップされたタイミングでclickDone
が発動するようになります。
onChanged
には、bool?型の引数を要求する関数が求められています。(これはRadioの上でcommand+カーソルでわかる)
今回は、bool?型の引数を要求する名前のない関数を渡してしまって、その関数の中でclickDone
を呼び出します。
これはindex
をclickDone
に渡すためです。index
は本来ListView.builder
の中でしか使えないのでこのような書き方をする必要があります。
👇まずonChanged
にbool?型の引数を要求する無名関数を渡しておく
leading: Radio<bool?>(
value: false,
groupValue: null,
onChanged: (bool? value) {},
),
👇そして無名関数の中でclickDone
を呼び出して、引数としてindex
を渡してあげる。
leading: Radio<bool?>(
value: false,
groupValue: null,
onChanged: (bool? value) {
clickDone(index);
},
),
最後に画面の更新をするためにsetState
を追加しましょう。
void clickDone(int index) {
setState(() {
todoItems.removeAt(index);
});
}
変更後: ラジオボタンタップでリストから消えるはずです👇