πŸ“Έ Easy Gallery Saver

pub package License: MIT

Rasmlarni galereiyaga saqlash uchun eng oddiy va eng tez Flutter package!
Save images to gallery with just ONE line of code!

βœ… Hech qanday tashqi dependency yo'q - To'liq native implementation
βœ… Bitta funksiya chaqiruvi - EasyGallerySaver.saveImage()
βœ… Asset, File, Network - Barcha manbalarni qo'llab-quvvatlaydi
βœ… Avtomatik ruxsat - Permission handling ichida
βœ… Custom album - O'z albomingizni yarating
βœ… Android 13+ support - Eng yangi Android versiyalari
βœ… iOS 11+ - Barcha iOS qurilmalari

πŸ“¦ O'rnatish / Installation

pubspec.yaml fayliga qo'shing:

dependencies:
  easy_gallery_saver: ^1.0.1

Keyin:

flutter pub get

πŸš€ Foydalanish / Usage

Import qiling

import 'package:easy_gallery_saver/easy_gallery_saver.dart';

Bitta qatorlik kod!

bool saved = await EasyGallerySaver.saveImage('assets/images/photo.jpg');

Bu qadar! πŸŽ‰

πŸ“ Batafsil misollar / Detailed Examples

1️⃣ Asset dan rasm saqlash

bool result = await EasyGallerySaver.saveImage('assets/images/logo.png');

if (result) {
  print('βœ… Rasm saqlandi!');
} else {
  print('❌ Xatolik yuz berdi');
}

2️⃣ Internetdan rasm saqlash

await EasyGallerySaver.saveImage(
  'https://picsum.photos/800/600'
);

3️⃣ File system dan rasm saqlash

File imageFile = File('/path/to/image.jpg');
await EasyGallerySaver.saveImage(imageFile.path);

4️⃣ Custom albom nomi bilan

await EasyGallerySaver.saveImage(
  'assets/images/photo.jpg',
  albumName: 'My Special Album',
);

5️⃣ Tugma bilan to'liq misol

import 'package:flutter/material.dart';
import 'package:easy_gallery_saver/easy_gallery_saver.dart';

class SaveImageButton extends StatefulWidget {
  @override
  _SaveImageButtonState createState() => _SaveImageButtonState();
}

class _SaveImageButtonState extends State<SaveImageButton> {
  bool _isLoading = false;

  Future<void> _saveImage() async {
    setState(() => _isLoading = true);

    bool result = await EasyGallerySaver.saveImage(
      'https://picsum.photos/800/600',
      albumName: 'Downloaded Images',
    );

    setState(() => _isLoading = false);

    ScaffoldMessenger.of(context).showSnackBar(
      SnackBar(
        content: Text(result ? 'βœ… Saved!' : '❌ Failed'),
        backgroundColor: result ? Colors.green : Colors.red,
      ),
    );
  }

  @override
  Widget build(BuildContext context) {
    return ElevatedButton.icon(
      onPressed: _isLoading ? null : _saveImage,
      icon: _isLoading 
          ? SizedBox(
              width: 20,
              height: 20,
              child: CircularProgressIndicator(strokeWidth: 2),
            )
          : Icon(Icons.download),
      label: Text(_isLoading ? 'Saving...' : 'Save Image'),
    );
  }
}

6️⃣ Ruxsatni tekshirish

bool hasPermission = await EasyGallerySaver.checkPermission();

if (!hasPermission) {
  print('Galereiyaga kirish ruxsati yo\'q');
}

βš™οΈ Platformani sozlash / Platform Setup

πŸ“± Android Setup

android/app/src/main/AndroidManifest.xml fayliga qo'shing:

<manifest xmlns:android="http://schemas.android.com/apk/res/android">
    <application>
        <!-- ... -->
    </application>
    
    <!-- Android 12 va pastroq uchun -->
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"
        android:maxSdkVersion="32" />
    
    <!-- Android 13+ uchun -->
    <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" />
</manifest>

🍎 iOS Setup

ios/Runner/Info.plist fayliga qo'shing:

<dict>
    <!-- ... boshqa sozlamalar ... -->
    
    <key>NSPhotoLibraryAddUsageDescription</key>
    <string>Rasmlarni galereiyaga saqlash uchun ruxsat kerak</string>
    
    <key>NSPhotoLibraryUsageDescription</key>
    <string>Rasmlarni ko'rish uchun ruxsat kerak</string>
</dict>

πŸ“š API Reference

saveImage()

Rasmni galereiyaga saqlaydi.

static Future<bool> saveImage(
  String imagePath, {
  String? albumName,
})

Parametrlar:

  • imagePath (String, required) - Rasm manbasi:
    • Asset: 'assets/images/photo.jpg'
    • File: '/storage/emulated/0/Pictures/photo.jpg'
    • Network: 'https://example.com/image.jpg'
  • albumName (String, optional) - Albom nomi (default: "EasyGallerySaver")

Qaytaradi:

  • Future<bool> - true agar muvaffaqiyatli, false agar xatolik

Misol:

bool success = await EasyGallerySaver.saveImage(
  'https://example.com/photo.jpg',
  albumName: 'My Photos',
);

checkPermission()

Galereiya ruxsati holatini tekshiradi.

static Future<bool> checkPermission()

Qaytaradi:

  • Future<bool> - true agar ruxsat berilgan, false agar yo'q

Misol:

bool hasPermission = await EasyGallerySaver.checkPermission();

πŸ’‘ Ko'p uchraydigan savollar / FAQ

❓ Qanday formatlar qo'llab-quvvatlanadi?

Barcha rasm formatlari: JPG, PNG, GIF, BMP, WebP va boshqalar.

❓ Rasmlar qayerga saqlanadi?

Android: Pictures/[AlbumName]/ papkaga
iOS: Photo Library ga, belgilangan albomga

❓ Ruxsat avtomatik so'raladimi?

Ha! Package avtomatik ravishda kerakli ruxsatlarni so'raydi.

❓ Internetdan yuklash vaqtini qanday boshqarish mumkin?

Package avtomatik yuklaydi. Faqat loading indicator ko'rsatish kerak:

setState(() => isLoading = true);
await EasyGallerySaver.saveImage(url);
setState(() => isLoading = false);

❓ Bir nechta rasmni birgalikda saqlay olamanmi?

Ha, loop dan foydalaning:

List<String> images = [
  'https://example.com/1.jpg',
  'https://example.com/2.jpg',
  'https://example.com/3.jpg',
];

for (String url in images) {
  await EasyGallerySaver.saveImage(url);
}

❓ Custom fayl nomini qo'yish mumkinmi?

Rasmlar avtomatik IMG_YYYYMMDD_HHMMSS.jpg formatida nomlanadi.

πŸ”§ Texnik talablar / Requirements

  • Flutter SDK: >=3.0.0
  • Dart SDK: >=3.10.0
  • Android: API level 21+ (Android 5.0+)
  • iOS: 11.0+

πŸ“¦ Dependencies

Faqat bitta dependency:

  • permission_handler - Ruxsatlarni boshqarish uchun

Note: Biz image_gallery_saver ishlatmaymiz! To'liq native implementation.

🎯 Xususiyatlar / Features

  • βœ… Native Android va iOS kodi
  • βœ… Scoped Storage (Android 10+) qo'llab-quvvatlash
  • βœ… Photo Library (iOS) to'liq qo'llab-quvvatlash
  • βœ… Avtomatik ruxsat so'rash
  • βœ… Custom album yaratish
  • βœ… Xatoliklarni boshqarish
  • βœ… Debugging support
  • βœ… Async/await qo'llab-quvvatlash

πŸ› Muammolar / Issues

Muammo yuzaga kelsa:

  1. GitHub Issues ga xabar bering
  2. Muammoni batafsil tasvirlab bering
  3. Platforma va versiyani ko'rsating
  4. Error log ni qo'shing

🀝 Hissa qo'shish / Contributing

Hissa qo'shmoqchimisiz? Juda yaxshi!

  1. Repository ni fork qiling
  2. Feature branch yarating: git checkout -b feature/NewFeature
  3. O'zgarishlaringizni commit qiling: git commit -m 'Add NewFeature'
  4. Branch ni push qiling: git push origin feature/NewFeature
  5. Pull Request oching

πŸ“„ License

MIT License - LICENSE faylida batafsil.

πŸ‘¨β€πŸ’» Muallif / Author

Abubakr - Flutter Developer

⭐ Yoqsa - yulduzcha bering!

Agar bu package sizga yordam bergan bo'lsa, GitHub da ⭐ bosing!

πŸ™ Minnatdorchilik

  • Flutter team
  • permission_handler package developers
  • Barcha contributors

Made with ❀️ in Uzbekistan πŸ‡ΊπŸ‡Ώ

Easy Gallery Saver - Rasmlarni saqlashning eng oson yo'li!

Libraries