[Flutter]1つの要素を選択できるリストビュー(ListView)

Flutter

どうも、ちょげ(@chogetarou)です。

1つの要素を選択できるリストビューを実装する方法を紹介します。

スポンサーリンク

方法

インターフェース, インターネット, プログラム, ブラウザ, Www

1つの要素を選択できるリストビューを実装するには、StatefulWidgetとListTileを使います。

まず、選択している要素を判別するための変数を用意します。

var selectedIndex = -1;

次に、リストの要素にListTileを指定します。

ListView.builder(
  itemCount: /*count*/,
  itemBuilder: (context, index) {
    return ListTile(
        title: Text('$index'),
      );
  },
),

そして、引数「onTap」に選択されたインデックスが変数に格納される処理を追加します。

ListView.builder(
  itemCount: /*count*/,
  itemBuilder: (context, index) {
    return ListTile(
        onTap: () {
          setState(() {
            selectedIndex = index;
          });
        },
        title: Text('$index'),
      );
  },
),

最後に、ListTileの引数「selected」に選択されているかどうかの「bool値」を指定します。

また、引数「selectedColor」に選択されている時の色を指定します。

ListView.builder(
  itemCount: /*count*/,
  itemBuilder: (context, index) {
    return ListTile(
        selected: selectedIndex == index ? true : false,
        selectedTileColor: /*選択されている時の色*/,
        onTap: () {
          setState(() {
            selectedIndex = index;
          });
        },
        title: Text('$index'),
      );
  },
),

これで1つの要素を選択できるリストビューを実装できます。

以下は、使用例です。

class Home extends StatefulWidget {
  const Home({Key? key}) : super(key: key);

  @override
  _HomeState createState() => _HomeState();
}

class _HomeState extends State<Home> {
  var selectedIndex = -1;
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: ListView.builder(
        itemCount: 20,
        itemBuilder: (context, index) {
          return Card(
            child: ListTile(
              selected: selectedIndex == index ? true : false,
              selectedTileColor: Colors.pink.withOpacity(0.2),
              onTap: () {
                setState(() {
                  selectedIndex = index;
                });
              },
              title: Text('$index'),
            ),
          );
        },
      ),
    );
  }
}

まとめ

1つの要素を選択できるリストビューを実装するには、ListTileを使います。

コメント

タイトルとURLをコピーしました