lib/photo_list_screen.dart
import 'dart:io';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:file_picker/file_picker.dart';
import 'package:firebase_auth/firebase_auth.dart';
import 'package:firebase_storage/firebase_storage.dart';
import 'package:flutter/material.dart';
import 'package:photoapp/photo_view_screen.dart';
import 'package:photoapp/sign_in_screen.dart';
// ...
class _PhotoListScreenState extends State<PhotoListScreen> {
// ...
@override
Widget build(BuildContext context) {
// ログインしているユーザーの情報を取得
final User user = FirebaseAuth.instance.currentUser!;
return Scaffold(
// ...
body: StreamBuilder<QuerySnapshot>(
// Cloud Firesstoreからデータを取得
stream: FirebaseFirestore.instance
.collection('users/${user.uid}/photos')
.orderBy('createdAt', descending: true)
.snapshots(),
builder: (context, snapshot) {
// Cloud Firestoreからデータを取得中の場合
if (snapshot.hasData == false) {
return Center(
child: CircularProgressIndicator(),
);
}
// Cloud Firestoreからデータを取得完了した場合
final QuerySnapshot query = snapshot.data;
// 画像のURL一覧を作成
final List<String> imageList = query.docs
.map((doc) => doc.get('imageURL') as String)
.toList();
return PageView(
controller: _controller,
onPageChanged: (int index) => _onPageChanged(index),
children: [
//「全ての画像」を表示する部分
PhotoGridView(
// Cloud Firestoreから取得した画像のURL一覧を渡す
imageList: imageList,
onTap: (imageURL) => _onTapPhoto(imageURL, imageList),
),
//「お気に入り登録した画像」を表示する部分
PhotoGridView(
// お気に入り登録した画像は、後ほど実装
imageList: [],
onTap: (imageURL) => _onTapPhoto(imageURL, imageList),
),
],
);
},
),
// ...
);
}
// ...
void _onTapPhoto(String imageURL, List<String> imageList) {
Navigator.of(context).push(
MaterialPageRoute(
builder: (_) => PhotoViewScreen(
imageURL: imageURL,
imageList: imageList,
),
),
);
}
}
// Widgetを新たに定義し再利用できる
class PhotoGridView extends StatelessWidget {
const PhotoGridView({
Key? key,
// 引数から画像のURL一覧を受け取る
required this.imageList,
required this.onTap,
}) : super(key: key);
final List<String> imageList;
final Function(String imageURL) onTap;
@override
Widget build(BuildContext context) {
return GridView.count(
// ...
children: imageList.map((String imageURL) {
// ...
}).toList(),
);
}
}