📱

FlutterのSingleChildScrollView + ColumnでListを表示

2023/01/15に公開

作成するアプリ

前々回の記事でListView.buildでListに保持したデータを表示するアプリケーションを作成しました。

今回は同様のものをSingleChildScrollViewとColumnウィジェットを使って実現してみます。

ListViewとColumnの違い

上記でSingleChildScrollViewを使うと言いましたが、ListViewとColumnで仕様が異なるためSingleChildScrollViewと組み合わせています。

ListViewでListを表示させて、画面に入りきらない場合、スクロールすることで全体を参照できます。
ColumnのみでListを表示させた場合はスクロールしてくれません。そこで、SingleChildScrollViewでラップして実現します。

ソースコード

main.dart
import 'package:flutter/material.dart';

void main() {
  runApp(const MyApp());
}

class MyApp extends StatelessWidget {
  const MyApp({super.key});

  // This widget is the root of your application.
  
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: const MyHomePage(title: 'Flutter Demo Home Page'),
    );
  }
}

class MyHomePage extends StatefulWidget {
  const MyHomePage({super.key, required this.title});

  final String title;

  
  State<MyHomePage> createState() => _MyHomePageState();
}

class _MyHomePageState extends State<MyHomePage> {
  List<String> strList = [
    'テスト1',
    'テスト2',
    'テスト3',
    'テスト4',
    'テスト5',
    'テスト6',
    'テスト7',
    'テスト8',
    'テスト9',
    'テスト10'
  ];

  
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text(widget.title),
      ),
      body: SingleChildScrollView(
        child: Column(
            children: strList
                .map(
                    (str) => SizedBox(width: double.infinity, child: Text(str)))
                .toList()),
      ),
    );
  }
}

説明

ColumnのchildrenにList.map().toList()を指定して、Listの要素分ウィジェットを作成しています。
それをSingleChildScrollViewでラップする作りになっています。

左寄せ、上寄せにしたかったので、Centerは削除しました。

スクロールさせる領域をウィンドウの横幅いっぱいとしたかったので、SizedBoxでwidthにdouble.infinityを指定しています。

上記の対応をすることでListView.buildと同等のことができますが、使い分けについてはこれから色々とアプリを作って、覚えていくのだと思っています。

実行結果

実行した際の画面は以下の通りです。

今回の記事は以上となります。

Discussion