XFile
과 File
의 차이점을 상세하게 비교
📌 개요 (Overview)
File
은 Dart의 dart:io 패키지에 속한 전통적인 파일 클래스입니다.XFile
은 Flutter의 image_picker / cross_file에서 제공되는 추상적이고 플랫폼 간 일관된 파일 객체입니다.
📂 클래스 정의 비교 (Class Definition Comparison)
✅ File
(dart:io)
import 'dart:io'; File myFile = File('/path/to/file.jpg');
- Android, iOS 등 모바일 전용
- Web에서는 사용 불가 (dart:io 사용 불가)
✅ XFile
(cross_file)
import 'package:image_picker/image_picker.dart'; XFile xfile = await picker.pickImage(source: ImageSource.gallery);
- 모든 플랫폼 지원 (Android, iOS, Web, Desktop 등)
readAsBytes()
,readAsString()
,saveTo()
등의 메서드 제공
🔍 주요 차이점 (Key Differences)
항목 (Feature) | File | XFile |
---|---|---|
정의 위치 | dart:io | package:cross_file / image_picker |
Web 지원 | ❌ 지원 안 됨 | ✅ 지원함 |
경로 접근 (path ) | ✅ 사용 가능 | ✅ 사용 가능 |
바이트 읽기 | readAsBytes() | readAsBytes() |
스트림 지원 | ✅ (openRead ) | ❌ (XFile 은 스트림 제공 안함) |
쓰기 (writeAs... ) | ✅ 가능 | ❌ 지원 안됨 (XFile 은 읽기 전용) |
saveTo 메서드 | ❌ 없음 | ✅ 있음 (saveTo(path) ) |
🧪 실전 예제 (Practical Examples)
1️⃣ 모바일(Android/iOS)에서 이미지 선택 후 업로드
final ImagePicker picker = ImagePicker(); XFile? image = await picker.pickImage(source: ImageSource.gallery); if (image != null) { File file = File(image.path); // XFile → File List<int> bytes = await file.readAsBytes(); }
2️⃣ 웹(Web)에서 이미지 업로드 (XFile만 가능)
final picked = await picker.pickImage(source: ImageSource.gallery); if (picked != null) { Uint8List bytes = await picked.readAsBytes(); // File로는 불가능. Web에서는 XFile 필수 }
🎯 언제 사용해야 할까? (When to Use Which)
상황 (Use Case) | 추천 클래스 (Recommended) |
---|---|
Android/iOS에서 파일 읽고 저장할 때 | File |
플랫폼에 관계없이 이미지 선택 후 전송 | XFile |
Web 지원이 반드시 필요한 경우 | XFile |
디스크에 직접 저장(write)할 때 | File |
🔄 변환 방법 (Conversion Between XFile and File)
✅ XFile → File
XFile xfile = ...; File file = File(xfile.path);
⚠️ 단, Web에서는 이 방식이 동작하지 않음. Web에서는
readAsBytes()
만 가능.
✅ File → XFile (직접 생성은 불가)
XFile은 생성자 접근이 제한적이라 File → XFile 직접 변환은 어렵고, 보통 처음부터 XFile
을 사용합니다.
🧠 결론 요약 (Conclusion Summary)
요약 (Summary) | 설명 (Explanation) |
---|---|
플랫폼 호환성 | XFile 은 Web 포함 모든 플랫폼에서 사용 가능 |
유연성 | File 은 저장/쓰기, 스트림 처리 등 강력함 |
추천 패턴 | UI → XFile , 서버 전송 전 변환 시 File 또는 readAsBytes() 사용 |