A flutter plugin for handle native gallery apps

Gal🖼️

Easy to use Dart3 plugin for handle photos app

✨Features

  • Open gallery
  • Save video
  • Save image
  • Handle pemission
  • Handle errors
  • Lots of docs and wiki

🚀Get started

Add dependency

You can use the command to add gal as a dependency with the latest stable version:

$ flutter pub add gal

iOS

Add the following key to your Info.plist file, located in <project root>/ios/Runner/Info.plist:

Android (API <29)

Add the following key to your AndroidManifest file, located in <project root>/android/app/src/main/AndroidManifest.xml:

✅Usage

Save from local

//Save Image
await Gal.putImage('$filePath');

//Save Video
await Gal.putVideo('$filePath');

Download from Internet

$ flutter pub add dio

//Download Image
final imagePath = '${Directory.systemTemp.path}/image.jpg';
await Dio().download('$url',imagePath);
await Gal.putImage(imagePath);

//Download Video
final videoPath = '${Directory.systemTemp.path}/video.mp4';
await Dio().download('$url',videoPath);
await Gal.putVideo(videoPath);

Handle Permission

//Check Permission
await Gal.hasAccess();

//Request Access
await Gal.requestAccess();

🎯Example

Here is a minimal example. A best practice and more detailed one and can be found in the example folder.

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

void main() {
  runApp(const App());
}

class App extends StatelessWidget {
  const App({super.key});

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: Scaffold(
        body: Center(
          child: Column(
            mainAxisSize: MainAxisSize.min,
            children: [
              FilledButton.icon(
                onPressed: () async => Gal.open(),
                label: const Text('Open Gallery'),
                icon: const Icon(Icons.open_in_new),
              ),
              FilledButton.icon(
                onPressed: () async => Gal.putVideo('TODO: Change this text to video path'),
                label: const Text('Save Video'),
                icon: const Icon(Icons.video_file),
              ),
              FilledButton.icon(
                onPressed: () async => Gal.putImage('TODO: Change this text to image path'),
                label: const Text('Save Image'),
                icon: const Icon(Icons.image),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

📪FAQ

  • What is the best practice?

    Please see Best Practice in project wiki.

  • I have a question.

    Please see the Wiki first. If that didn’t solve the problem. You should go to the Discussion. Once you are sure there are no duplicates, please ask them through Q&A.

💚Contributing

Welcome! Feel free to create issue or PR. We kindly suggest considering to read this vary short guide.

GitHub

View Github