[Flutter]リストビュー(listview)を動的に作るには?

Flutter

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

ListViewを動的に作る方法を紹介します。

スポンサーリンク

方法

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

ListViewを動的に作るには、「ListView.builder」を使います。

ListView.builderでは、まず「itemCount」に要素数を指定します。

ListView.builder(
  itemCount: /*要素数*/,
),

そして、引数「builder」にリストの要素を戻り値とする「(context, index){}」のような関数を指定します。

「builder」に指定する関数の第2引数で、「0、1、2・・・」のように割り振られている要素の番号を取得することが出来ます。

この第2引数を使うことで、リストなどの要素にアクセスすることが出来ます。

ListView.builder(
  itemCount: /*要素数*/,
  itemBuilder: (BuildContext context, index) {
    return /*表示するリストの要素*/
  },
),

以下は、実際の使用例です。

Column(
  mainAxisSize: MainAxisSize.min,
  children: [
    Padding(
      padding: const EdgeInsets.all(8.0),
      child: TextField(
        controller: _controller,
        onChanged: (String? value) {
          _editText = value!;
        },
        decoration: InputDecoration(
          suffixIcon: IconButton(
            onPressed: () {
              _fruits.add(_editText);
              setState(() {
                _controller.clear();
              });
            },
            icon: Icon(Icons.add),
          ),
        ),
      ),
    ),
    ListView.builder(
      shrinkWrap: true,
      itemCount: _fruits.length,
      itemBuilder: (BuildContext context, index) {
        return Card(
          child: ListTile(
            title: Text(
              _fruits[index],
            ),
          ),
        );
      },
    ),
  ],
),

まとめ

ListViewを動的に作るには、「ListView.builder」を使います。

「ListView.builder」は、引数「itemCount」に要素数、引数「itemBuilder」でリストの要素を返す関数を指定します。

使用したコード

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

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

class _HomeState extends State<Home> {
  var _controller = TextEditingController();
  var _editText = '';
  var _fruits = <String>['Apple', 'Banana', 'Grape', 'Strawberry'];

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Column(
          mainAxisSize: MainAxisSize.min,
          children: [
            Padding(
              padding: const EdgeInsets.all(8.0),
              child: TextField(
                controller: _controller,
                onChanged: (String? value) {
                  _editText = value!;
                },
                decoration: InputDecoration(
                  suffixIcon: IconButton(
                    onPressed: () {
                      _fruits.add(_editText);
                      setState(() {
                        _controller.clear();
                      });
                    },
                    icon: Icon(Icons.add),
                  ),
                ),
              ),
            ),
            ListView.builder(
              shrinkWrap: true,
              itemCount: _fruits.length,
              itemBuilder: (BuildContext context, index) {
                return Card(
                  child: ListTile(
                    title: Text(
                      _fruits[index],
                    ),
                  ),
                );
              },
            ),
          ],
        ),
      ),
    );
  }
}

コメント

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