lib/photo_list_screen.dart
// ...
class _PhotoListScreenState extends State<PhotoListScreen> {
// ...
@override
Widget build(BuildContext context) {
return Scaffold(
body: PageView(
controller: _controller,
onPageChanged: (int index) => _onPageChanged(index),
children: [
// 「全ての画像」を表示する部分
Consumer(builder: (context, watch, child) {
final asyncPhotoList = watch(photoListProvider);
return asyncPhotoList.when(
data: (List<Photo> photoList) {
return PhotoGridView(
photoList: photoList,
onTap: (photo) => _onTapPhoto(photo, photoList),
onTapFav: (photo) => _onTapFav(photo),
);
},
loading: () {
return Center(
child: CircularProgressIndicator(),
);
},
error: (e, stackTrace) {
return Center(
child: Text(e.toString()),
);
},
);
}),
//「お気に入り登録した画像」を表示する部分
Consumer(builder: (context, watch, child) {
final asyncPhotoList = watch(favoritePhotoListProvider);
return asyncPhotoList.when(
data: (List<Photo> photoList) {
return PhotoGridView(
photoList: photoList,
onTap: (photo) => _onTapPhoto(photo, photoList),
onTapFav: (photo) => _onTapFav(photo),
);
},
loading: () {
return Center(
child: CircularProgressIndicator(),
);
},
error: (e, stackTrace) {
return Center(
child: Text(e.toString()),
);
},
);
}),
],
),
// ...
);
}
// ...
Future<void> _onTapFav(Photo photo) async {
final photoRepository = context.read(photoRepositoryProvider);
final toggledPhoto = photo.toggleIsFavorite();
await photoRepository!.updatePhoto(toggledPhoto);
}
}
class PhotoGridView extends StatelessWidget {
const PhotoGridView({
Key? key,
required this.photoList,
required this.onTap,
required this.onTapFav,
}) : super(key: key);
final List<Photo> photoList;
final void Function(Photo photo) onTap;
final void Function(Photo photo) onTapFav;
@override
Widget build(BuildContext context) {
return GridView.count(
// ...
children: photoList.map((Photo photo) {
return Stack(
children: [
// ...
Align(
alignment: Alignment.topRight,
child: IconButton(
onPressed: () => onTapFav(photo),
color: Colors.white,
icon: Icon(
// お気に入り登録状況に応じてアイコンを切り替え
photo.isFavorite == true
? Icons.favorite
: Icons.favorite_border,
),
),
),
],
);
}).toList(),
);
}
}