0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

FlutterAdvent Calendar 2024

Day 10

Flutterのチュートリアルを学んでみた(11)

Posted at

GridViewで写真ギャラリーを作ろう! 📸

GridViewって何? 🤔

インスタグラムのような写真ギャラリーを作りたいことありませんか?
そんなときに使うのがGridViewです!
格子状(こうしじょう)に並べて、スクロールできる画面が作れます。

GridViewを作る3つの方法 🎨

1. 数で指定(GridView.count)

写真を何枚ずつ横に並べるか指定する方法:

GridView.count(
  crossAxisCount: 2,  // 横に2枚ずつ
  children: [
    Image.asset('photo1.jpg'),
    Image.asset('photo2.jpg'),
    Image.asset('photo3.jpg'),
    Image.asset('photo4.jpg'),
  ],
)

image.png

使い道:

  • 写真ギャラリー
  • アプリのメニュー
  • 商品一覧

2. サイズで指定(GridView.extent)

それぞれの写真の最大幅を指定する方法:

GridView.extent(
  maxCrossAxisExtent: 150,  // 最大幅150px
  padding: EdgeInsets.all(4),
  mainAxisSpacing: 4,      // 縦の間隔
  crossAxisSpacing: 4,     // 横の間隔
  children: [
    Image.asset('photo1.jpg'),
    Image.asset('photo2.jpg'),
    Image.asset('photo3.jpg'),
  ],
)

image.png

3. ビルダー方式(GridView.builder)

たくさんの写真や無限スクロールに最適!

GridView.builder(
  gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
    crossAxisCount: 2,  // 横に2枚ずつ
  ),
  itemBuilder: (context, index) {
    return Image.asset('photo$index.jpg');
  },
)

image.png

写真の間に隙間を作る 📏

縦の隙間を作る

GridView.count(
  crossAxisCount: 2,
  mainAxisSpacing: 10,  // 10pxの縦の隙間
  children: [/*...*/],
)

image.png

横の隙間を作る

GridView.count(
  crossAxisCount: 2,
  crossAxisSpacing: 10,  // 10pxの横の隙間
  children: [/*...*/],
)

image.png

写真の形を変える 🖼

写真の縦横比を変更できます:

GridView.count(
  crossAxisCount: 2,
  childAspectRatio: 0.7,  // 縦長に
  children: [/*...*/],
)
  • 1.0: 正方形
  • 0.7: 縦長
  • 1.5: 横長

image.png

横スクロールにする ↔️

GridView.builder(
  scrollDirection: Axis.horizontal,  // 横スクロール
  gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
    crossAxisCount: 2,  // 縦に2枚
  ),
  itemBuilder: (context, index) {
    return Image.asset('photo$index.jpg');
  },
)

やってみよう! 💪

  1. シンプルな写真ギャラリー
GridView.count(
  crossAxisCount: 3,  // 横に3枚
  children: List.generate(9, (index) {
    return Container(
      color: Colors.blue,
      margin: EdgeInsets.all(5),
      child: Center(
        child: Text('写真 $index'),
      ),
    );
  }),
)
  1. おしゃれな商品一覧
GridView.extent(
  maxCrossAxisExtent: 200,
  padding: EdgeInsets.all(8),
  mainAxisSpacing: 8,
  crossAxisSpacing: 8,
  children: List.generate(12, (index) {
    return Card(
      child: Column(
        children: [
          Image.asset('product$index.jpg'),
          Text('商品名 $index'),
          Text('¥1,000'),
        ],
      ),
    );
  }),
)

こんなときはどうする? 🆘

  • 写真がはみ出る
    → BoxFit.coverを使う
  • スクロールできない
    → 親ウィジェットの制約を確認
  • 間隔がおかしい
    → spacingの値を調整

応用テクニック 🚀

  1. タップできる写真ギャラリー
GridView.builder(
  gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
    crossAxisCount: 3,
  ),
  itemBuilder: (context, index) {
    return GestureDetector(
      onTap: () {
        print('写真 $index がタップされました');
      },
      child: Image.asset('photo$index.jpg', fit: BoxFit.cover),
    );
  },
)
  1. アニメーション付きの表示
GridView.builder(
  gridDelegate: SliverGridDelegateWithFixedCrossAxisCount(
    crossAxisCount: 2,
  ),
  itemBuilder: (context, index) {
    return AnimatedContainer(
      duration: Duration(milliseconds: 500),
      child: Image.asset('photo$index.jpg'),
    );
  },
)
0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?