<aside> ❓ 1. 패키지 image_picker를 활용하여 다음의 UI를 만들어주세요.
gif
Requirements
List.generate를 사용하여 사진을 넣을 위젯들을 생성하고, List.generate로 생성할 위젯들은 photoItem 파일으로 분리해 photoItem에 함수와 선택한 이미지를 넘겨주는 방식으로 이미지를 선택했을 때 리스트를 업데이트하도록 구현했습니다
main.dart
import 'package:flutter/material.dart';
import 'photo4cut.dart';
void main() {
  runApp(const MyApp());
}
class MyApp extends StatelessWidget {
  const MyApp({super.key});
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      theme: ThemeData.dark(),
      home: Photo4cut(),
    );
  }
}
photoItem.dart
import 'dart:io';
import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';
class PhotoItem extends StatelessWidget {
  const PhotoItem({Key? key, required this.onImageSelected, this.selectedImage,}) : super(key: key);
  // 이미지 선택 시 호출할 함수
  final Function(XFile?) onImageSelected;
  final XFile? selectedImage;
  @override
  Widget build(BuildContext context) {
    return GestureDetector(
      onTap: () async {
        var image = await ImagePicker().pickImage(source: ImageSource.gallery);
        onImageSelected(image);
      },
      onDoubleTap: () {
        onImageSelected(null);
      },
      child: Container(
        width: 300,
        height: 150,
        color: Colors.grey[900],
        child: selectedImage == null
            ? null
            : Image.file(File(selectedImage!.path), fit: BoxFit.cover),
      ),
    );
  }
}
photo4cut.dart
import 'package:flutter/material.dart';
import 'package:image_picker/image_picker.dart';
import 'photoItem.dart';
class Photo4cut extends StatefulWidget {
  const Photo4cut({Key? key}) : super(key: key);
  @override
  State<Photo4cut> createState() => _Photo4cutState();
}
class _Photo4cutState extends State<Photo4cut> {
  // 이미지가 담길 변수를 null로 미리 초기화해두기
  List<XFile?> selectedImageList = List<XFile?>.filled(4, null);
  @override
  Widget build(BuildContext context) {
    return Scaffold(
      backgroundColor: Colors.black,
      appBar: AppBar(
        centerTitle: true,
        title: Text('포토네컷'),
        backgroundColor: Colors.transparent,
        elevation: 0,
      ),
      body: Center(
        child: Padding(
          padding: const EdgeInsets.all(8.0),
          child: Column(
            children: List.generate(4, (index) => Padding(
                padding: const EdgeInsets.only(bottom: 8.0),
                child: PhotoItem(
                  selectedImage: selectedImageList[index],
                  // 이미지 선택 시 selectedImageList 업데이트
                  onImageSelected: (XFile? image) {
                    setState(() {
                      selectedImageList[index] = image;
                    });
                  },
                ),
              ),
            ),
          ),
        ),
      ),
    );
  }
}
