Here is your full README.md
file for your Flutter Image Upload Widget, including setup, permissions, usage, customization, and platform-specific instructions:
📄 README.md
# 📸 Flutter Image Upload Widget
A reusable, beautiful, and customizable Flutter widget to upload images using the device **camera** or **gallery**, with support for **edit, delete**, and **upload** actions.
> ✅ No third-party dependencies except `image_picker`.
---
## ✨ Features
- 📷 Pick images from **camera** or **gallery**
- 🖼️ Display image preview (supports multiple)
- 🗑️ **Delete** or ✏️ **Edit** (replace) images
- 🔘 Upload action with callback
- 🎨 Fully customizable UI (labels, colors, size)
- 🚫 No external compression/storage dependencies
---
## 📦 Installation
### 1. Add dependencies
In your `pubspec.yaml`:
```yaml
dependencies:
flutter:
sdk: flutter
image_upload: ^latest_version
Then run:
flutter pub get
2. Android Setup
➕ AndroidManifest.xml
Path: android/app/src/main/AndroidManifest.xml
Add permissions outside <application>
:
<uses-permission android:name="android.permission.CAMERA"/>
<uses-permission android:name="android.permission.READ_MEDIA_IMAGES"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" android:maxSdkVersion="28"/>
Add this inside <application>
:
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths"/>
</provider>
➕ Create file: android/app/src/main/res/xml/provider_paths.xml
<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
<external-path name="external_files" path="." />
</paths>
3. iOS Setup
➕ ios/Runner/Info.plist
Add the following entries inside <dict>
:
<key>NSCameraUsageDescription</key>
<string>This app needs access to the camera to take photos.</string>
<key>NSPhotoLibraryUsageDescription</key>
<string>This app needs access to the photo library to select images.</string>
<key>NSMicrophoneUsageDescription</key>
<string>This app needs access to the microphone for video recording.</string>
🚀 Usage
Import the widget:
import 'image_upload_widget.dart';
Use in your UI:
ImageUploadWidget(
allowMultiple: true,
onImagesSelected: (List<File> images) {
// Called after image(s) selected
debugPrint("Selected images: ${images.map((e) => e.path)}");
},
onUploadTap: (List<String> paths) {
// Called when upload button is pressed
debugPrint("Ready to upload: $paths");
},
);
🎛️ Customization
Parameter | Type | Default | Description |
---|---|---|---|
allowMultiple |
bool |
false |
Allow picking multiple images |
title |
String |
"Upload Image" |
Title displayed on top |
cameraText |
String |
"Camera" |
Camera button label |
galleryText |
String |
"Gallery" |
Gallery button label |
uploadButtonText |
String |
"Upload" |
Upload button label |
onImagesSelected |
Function(List<File>) |
required | Triggered after image(s) selected |
onUploadTap |
Function(List<String>) |
required | Triggered when upload is tapped |
📂 Directory Structure
lib/
┣ widgets/
┃ ┗ image_upload_widget.dart
┗ main.dart
📸 Screenshots
Empty State | With Images |
---|---|
![]() |
![]() |
🛡 Permissions
Use permission_handler (optional) if you want to ask permissions manually on runtime:
// Optional: Check and request permissions
await Permission.camera.request();
await Permission.photos.request();
📃 License
This widget is licensed under the MIT License — free for personal & commercial use.
💬 Contributions
Found a bug or want to add a feature? Feel free to contact with me.
Happy Coding 💙
---
## 👨💻 Author
**Md. Rahul Reza**
* Website: [rahulreza.com](https://www.rahulreza.com)
* Contact: contact@rahulreza.com