lib/photo_list_screen.
import 'package:flutter/material.dart';
class PhotoListScreen extends StatefulWidget {
@override
_PhotoListScreenState createState() => _PhotoListScreenState();
}
class _PhotoListScreenState extends State<PhotoListScreen> {
// ...
@override
Widget build(BuildContext context) {
return Scaffold(
// ...
body: PageView(
controller: _controller,
onPageChanged: (int index) => _onPageChanged(index),
children: [
//「全ての画像」を表示する部分
PhotoGridView(),
//「お気に入り登録した画像」を表示する部分
PhotoGridView(),
],
),
// ...
);
}
// ...
}
class PhotoGridView extends StatelessWidget {
@override
Widget build(BuildContext context) {
// ダミー画像一覧
final List<String> imageList = [
'https://placehold.jp/400x300.png?text=0',
'https://placehold.jp/400x300.png?text=1',
'https://placehold.jp/400x300.png?text=2',
'https://placehold.jp/400x300.png?text=3',
'https://placehold.jp/400x300.png?text=4',
'https://placehold.jp/400x300.png?text=5',
];
// GridViewを使いタイル状にWidgetを表示する
return GridView.count(
// 1行あたりに表示するWidgetの数
crossAxisCount: 2,
// Widget間のスペース(上下)
mainAxisSpacing: 8,
// Widget間のスペース(左右)
crossAxisSpacing: 8,
// 全体の余白
padding: const EdgeInsets.all(8),
// 画像一覧
children: imageList.map((String imageURL) {
// Stackを使いWidgetを前後に重ねる
return Stack(
children: [
SizedBox(
width: double.infinity,
height: double.infinity,
// Widgetをタップ可能にする
child: InkWell(
onTap: () => {},
// URLを指定して画像を表示
child: Image.network(
imageURL,
// 画像の表示の仕方を調整できる
// 比率は維持しつつ余白が出ないようにするので cover を指定
// https://api.flutter.dev/flutter/painting/BoxFit-class.html
fit: BoxFit.cover,
),
),
),
// 画像の上にお気に入りアイコンを重ねて表示
// Alignment.topRightを指定し右上部分にアイコンを表示
Align(
alignment: Alignment.topRight,
child: IconButton(
onPressed: () => {},
color: Colors.white,
icon: Icon(Icons.favorite_border),
),
),
],
);
}).toList(),
);
}
}