class ImageInput extends StatefulWidget {
const ImageInput({super.key});
State<ImageInput> createState() {
return _ImageInputState();
}
}
class _ImageInputState extends State<ImageInput> {
void _takePicture() {}
Widget build(BuildContext context) {
return Container(
decoration: BoxDecoration(
border: Border.all(
width: 1,
color: Theme.of(context).colorScheme.primary.withOpacity(0.2),
),
),
height: 250,
width: double.infinity,
alignment: Alignment.center,
child: TextButton.icon(
onPressed: () {},
icon: const Icon(Icons.camera),
label: const Text('Take Picture'),
),
);
}
}
우선 이 flutter image picker를 받아주자. 위 플러그인은 사용자의 카메라나 혹은 갤러리에 접근하여 기존의 이미지를 불러오는 것이 가능하도록 도와준다.
하지만 주의사항이 있다. 그래서 반드시 Read Me 파일을 읽어봐야한다. ios같은 경우는 23.08.05를 기준으로
<project root/>/ios/Runner/
에서 Info.plist
라는 파일을 만들어서 밑에 list로 표시된 3개의 키를 등록하라는 것ㅇ디ㅏ.source
부분에 호버링하면 ImageSource라는 타입을 갖는 객체를 설정하라고 나온다. 이에 똑같이 작성하고 카메라는 카메라 갤러리는 갤러리 이렇게 지정해주면 된다. XFile
이라는 타입의 값을 반환하는데 이는 단순히 해당 파일을 나타내는 타입이다. 알아두자. 하지만 또 자세히 보야할 점은 바로 Future
객체라는 것이다. 따라서 사용자가 해당 파일을 업로드 했을 때의 이후 동작에 대하여도 명시해 줘야한다. 따라서 오류 처리를 해줘야한다.이제 사용자가 해당 이미지를 고르면 pickedImage에 저장하고 변수를 하나 선언하여 해당 변수에 사용자가 선택한 image와 만약 선택하지 않았다면 기본 UI를 보여줘야할 것이다.
File 속성은 따로 자동완성이 안 되므로 import 'dart:io'
를 직접 타이핑 하여 import 해주면 이상없이 File 타입이 먹는다.
변수는 당연히 optional 처리를 해줘야한다. null일 수 있기 때문이다.
그런데 여기서 문제는 사용자가 선택한 이미지가 X 파일 형식이라서 File 타입과 호환되지 않는다는 것이다.
그러므로 x 파일을 일반 파일로 변환해야 하는데
DART가 제공하는 파일 클래스를 인스턴스화하면 된다. 그리고 변수로 이미지 경로를 전달해주면 된다.
그리고 UI가 업데이트 되어야하기 때문에 setState 메서드를 사용하여 업데이트 되어야할 부분에 selectedImage 변수가 들어간 부분을 작성해주면 된다.
이때 Image의 File 메서드를 사용하면 된다. 그리고 다행히 우리가 앞서 dart:io의 File 생성자로 이미 형변환을 했기 때문에 그냥 넣어주면 된다. 여기서는 추가적으로 작성한 Container에 fit하게 들어가도록 설정해주었다.
참고로 iOS는 시뮬레이터에 카메라 시뮬레이터를 별도로 깔아야하지만 Andoriod는 그냥 시뮬레이터가 깔려있기 때문에 사용하면 된다.
GestureDetector
를 사용하면 된다.
정리가 잘 된 글이네요. 도움이 됐습니다.