• Stars
    star
    675
  • Rank 66,879 (Top 2 %)
  • Language
    Dart
  • License
    Apache License 2.0
  • Created about 6 years ago
  • Updated about 2 months ago

Reviews

There are no reviews yet. Be the first to send feedback to the community and the maintainers!

Repository Details

A Flutter plugin that provides images, videos, and audio abstraction management APIs without interface integration, available on Android, iOS, macOS and OpenHarmony.

photo_manager

English | 中文说明 (🚧 WIP)

pub package pub pre-release package Build status GitHub license

GitHub stars GitHub forks Awesome Flutter FlutterCandies

A Flutter plugin that provides assets abstraction management APIs without UI integration, you can get assets (image/video/audio) on Android, iOS and macOS.

Projects using this plugin

name pub github
wechat_assets_picker pub package star
wechat_camera_picker pub package star

Articles about this plugin

Migration guide

For versions upgrade across major versions, see the migration guide for detailed info.

Common issues

Please search common issues in GitHub issues for build errors, runtime exceptions, etc.

Prepare for use

Add the plugin reference to pubspec.yaml

Two ways to add the plugin to your pubspec:

  • (Recommend) Run flutter pub add photo_manager.
  • Add the plugin reference in your pubspec.yaml's dependencies section:
dependencies:
  photo_manager: $latest_version

The latest stable version is: pub package

Import in your projects

import 'package:photo_manager/photo_manager.dart';

Configure native platforms

Minimum platform versions: Android 16, iOS 9.0, macOS 10.15.

Android config preparation

Kotlin, Gradle, AGP

Starting from 1.2.7, We ship this plugin with Kotlin 1.5.21 and Android Gradle Plugin 4.1.0. If your projects use a lower version of Kotlin/Gradle/AGP, please upgrade them to a newer version.

More specifically:

  • Upgrade your Gradle version (gradle-wrapper.properties) to 7.5.1 or the latest version.
  • Upgrade your Kotlin version (ext.kotlin_version) to 1.5.30 or the latest version.
  • Upgrade your AGP version (com.android.tools.build:gradle) to 7.2.2 or the latest version.
Android 10+ (Q, 29)

If you're not compiling or targeting with 29 and above, you can skip this section.

On Android 10, Scoped Storage was introduced, which causes the origin resource file not directly inaccessible through it file path.

If your compileSdkVersion or targetSdkVersion is 29, you can consider adding android:requestLegacyExternalStorage="true"to yourAndroidManifest.xml` in order to obtain resources:

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.fluttercandies.photo_manager_example">

    <application
        android:label="photo_manager_example"
        android:icon="@mipmap/ic_launcher"
        android:requestLegacyExternalStorage="true">
    </application>
</manifest>

Note: Apps that are using the flag will be rejected from the Google Play.

This is not a requirement, the plugin can still work with caching files. But you'll need to control caches on your own, the best practice is to clear file caches each time when you start your app by calling PhotoManager.clearFileCache().

Glide

The plugin use Glide to create thumbnail bytes for Android.

If you found some warning logs with Glide appearing, it means the main project needs an implementation of AppGlideModule. See Generated API for the implementation.

iOS config preparation

Define the NSPhotoLibraryUsageDescription key-value in the ios/Runner/Info.plist:

<key>NSPhotoLibraryUsageDescription</key>
<string>In order to access your photo library</string>

If you want to grant only write-access to the photo library on iOS 11 and above, define the NSPhotoLibraryAddUsageDescription key-value in the ios/Runner/Info.plist. It's pretty much the same as the NSPhotoLibraryUsageDescription.

permissions in Xcode

Usage

Request for permission

Most of the APIs can only use with granted permission.

final PermissionState _ps = await PhotoManager.requestPermissionExtend();
if (_ps.isAuth) {
  // Granted.
} else {
  // Limited(iOS) or Rejected, use `==` for more precise judgements.
  // You can call `PhotoManager.openSetting()` to open settings for further steps.
}

But if you're pretty sure your callers will be only called after the permission is granted, you can ignore permission checks:

PhotoManager.setIgnorePermissionCheck(true);

Limited entities access on iOS

With iOS 14 released, Apple brought a "Limited Photos Library" to iOS. So use the PhotoManager.requestPermissionExtend() to request permissions. The method will return PermissionState. See PHAuthorizationStatus for more detail.

To reselect accessible entites for the app, use PhotoManager.presentLimited() to call the modal of accessible entities' management. This method only available for iOS 14+ and when the permission state is limited (PermissionState.limited), other platform won't make a valid call.

Get albums/folders (AssetPathEntity)

Albums or folders are abstracted as the AssetPathEntity class. It represents a bucket in the MediaStore on Android, and the PHAssetCollection object on iOS/macOS. To get all of them:

final List<AssetPathEntity> paths = await PhotoManager.getAssetPathList();

See getAssetPathList for more detail.

Get assets (AssetEntity)

Assets (images/videos/audios) are abstracted as the AssetEntity class. It represents a series of fields with MediaStore on Android, and the PHAsset object on iOS/macOS.

PMFilter

Some methods of PhotoManager and AssetPathEntity have a filterOption.

  • PhotoManager
    • getAssetPathList (The filter param passed in by this method will be passed into the AssetPathEntity of the result)
    • getAssetCount
    • getAssetListRange
    • getAssetListPaged
  • AssetPathEntity
    • constructor (Method not recommended for users)
    • fromId
    • obtainPathFromProperties (Method not recommended for users)

The PMFilter have two implementations:

PMFilterOptionGroup

Before 2.6.0, the only way to implement it.

final FilterOptionGroup filterOption = FilterOptionGroup(
  imageOption: FilterOption(
    sizeConstraint: SizeConstraint(
      maxWidth: 10000,
      maxHeight: 10000,
      minWidth: 100,
      minHeight: 100,
      ignoreSize: false,
    ),
  ),
  videoOption: FilterOption(
    durationConstraint: DurationConstraint(
      min: Duration(seconds: 1),
      max: Duration(seconds: 30),
      allowNullable: false,
    ),
  ),
  createTimeCondition: DateTimeCondition(
    min: DateTime(2020, 1, 1),
    max: DateTime(2020, 12, 31),
  ),
  orders: [
    OrderOption(
      type: OrderOptionType.createDate,
      asc: false,
    ),
  ],
  /// other options
);
CustomFilter

This is an experimental feature, please submit an issue if you have any problems.

CustomFilter was added in the 2.6.0 version of the plugin, which provide more flexible filtering conditions against host platforms.

It is closer to the native way of use. You can customize where conditions and order conditions. It is up to you to decide which fields to use for filtering and sorting

Like sql construct a sql statement.

The column name of iOS or android is different, so you need to use the CustomColumns.baseCustomColumns.android or CustomColumns.darwin to get the column name.

PMFilter createFilter() {
  final CustomFilter filterOption = CustomFilter.sql(
    where: '${CustomColumns.base.width} > 100 AND ${CustomColumns.base.height} > 200',
    orderBy: [OrderByItem.desc(CustomColumns.base.createDate)],
  );

  return filterOption;
}

Advanced filter

class AdvancedCustomFilter extends CustomFilter

The AdvancedCustomFilter is a subclass of CustomFilter, The have builder methods to help make a filter.

PMFilter createFilter() {
  final group = WhereConditionGroup()
          .and(
            ColumnWhereCondition(
              column: CustomColumns.base.width,
              value: '100',
              operator: '>',
            ),
          )
          .or(
            ColumnWhereCondition(
              column: CustomColumns.base.height,
              value: '200',
              operator: '>',
            ),
          );

  final filter = AdvancedCustomFilter()
          .addWhereCondition(group)
          .addOrderBy(column: CustomColumns.base.createDate, isAsc: false);
  
  return filter;
}

Main class of custom filter

  • CustomFilter : The base class of custom filter.
  • OrderByItem : The class of order by item.
  • SqlCustomFilter : The subclass of CustomFilter, It is used to make a like sql filter.
  • AdvancedCustomFilter: The subclass of CustomFilter, It is used to make a advanced filter.
    • WhereConditionItem : The class of where condition item.
      • TextWhereCondition: The class of where condition. The text will not be checked.
      • WhereConditionGroup : The class of where condition group. The class is used to make a group of where condition.
      • ColumnWhereCondition: The class of where condition. The column will be checked.
      • DateColumnWhereCondition: The class of where condition. Because dates have different conversion methods on iOS/macOS, this implementation smoothes the platform differences
  • CustomColumns : This class contains fields for different platforms.
    • base : The common fields are included here, but please note that the "id" field is invalid in iOS and may even cause errors. It is only valid on Android.
    • android : The columns of android.
    • darwin : The columns of iOS/macOS.

PS: The CustomColumns should be noted that iOS uses the Photos API, while Android uses ContentProvider, which is closer to SQLite. Therefore, even though they are called "columns," these fields are PHAsset fields on iOS/macOS and MediaStoreColumns fields on Android.

flow_chart

From AssetPathEntity

You can use the pagination method:

final List<AssetEntity> entities = await path.getAssetListPaged(page: 0, size: 80);

Or use the range method:

final List<AssetEntity> entities = await path.getAssetListRange(start: 0, end: 80);

From PhotoManager (Since 2.6.0)

First, You need get count of assets:

final int count = await PhotoManager.getAssetCount();

Then, you can use the pagination method:

final List<AssetEntity> entities = await PhotoManager.getAssetListPaged(page: 0, pageCount: 80);

Or use the range method:

final List<AssetEntity> entities = await PhotoManager.getAssetListRange(start: 0, end: 80);

Note: The page, start is base 0.

From ID

The ID concept represents:

  • The ID field of the MediaStore on Android.
  • The localIdentifier field of the PHAsset on iOS.

You can store the ID if you want to implement features that's related to persistent selections. Use AssetEntity.fromId to retrieve the entity once you persist an ID.

final AssetEntity? asset = await AssetEntity.fromId(id);

Be aware that the created asset might have limited access or got deleted in anytime, so the result might be null.

From raw data

You can create your own entity from raw data, such as downloaded images, recorded videos, etc. The created entity will show as a corresponding resource on your device's gallery app.

final Uint8List rawData = yourRawData;

// Save an image to an entity from `Uint8List`.
final AssetEntity? entity = await PhotoManager.editor.saveImage(
  rawData,
  title: 'write_your_own_title.jpg', // Affects EXIF reading.
);

// Save an existed image to an entity from it's path.
final AssetEntity? imageEntityWithPath = await PhotoManager.editor.saveImageWithPath(
  path, // Use the absolute path of your source file, it's more like a copy method.
  title: 'same_as_above.jpg',
);

// Save a video entity from `File`.
final File videoFile = File('path/to/your/video.mp4');
final AssetEntity? videoEntity = await PhotoManager.editor.saveVideo(
  videoFile, // You can check whether the file is exist for better test coverage.
  title: 'write_your_own_title.mp4',
);

// [iOS only] Save a live photo from image and video `File`.
// This only works when both image and video file were part of same live photo.
final File imageFile = File('path/to/your/livephoto.heic');
final File videoFile = File('path/to/your/livevideo.mp4');
final AssetEntity? entity = await PhotoManager.editor.darwin.saveLivePhoto(
  imageFile: imageFile,
  videoFile: videoFile,
  title: 'write_your_own_title.heic',
);

Be aware that the created asset might have limited access or got deleted in anytime, so the result might be null.

From iCloud

Resources might be saved only on iCloud to save disk space. When retrieving file from iCloud, the speed is depend on the network condition, which might be very slow that makes users feel anxious. To provide a responsive user interface, you can use PMProgressHandler to retrieve the progress when load a file.

The preferred implementation would be the LocallyAvailableBuilder in the wechat_asset_picker package, which provides a progress indicator when the file is downloading.

Display assets

The plugin provided the AssetEntityImage widget and the AssetEntityImageProvider to display assets:

final Widget image = AssetEntityImage(
  yourAssetEntity,
  isOriginal: false, // Defaults to `true`.
  thumbnailSize: const ThumbnailSize.square(200), // Preferred value.
  thumbnailFormat: ThumbnailFormat.jpeg, // Defaults to `jpeg`.
);

final Widget imageFromProvider = Image(
  image: AssetEntityImageProvider(
    yourAssetEntity,
    isOriginal: false,
    thumbnailSize: const ThumbnailSize.square(200),
    thumbnailFormat: ThumbnailFormat.jpeg,
  ),
);

Obtain "Live Photos"

This plugin supports obtain live photos and filtering them:

Filtering only "Live Photos"

This is supported when filtering only image.

final List<AssetPathEntity> paths = await PhotoManager.getAssetPathList(
  type: RequestType.image,
  filterOption: FilterOptionGroup(onlyLivePhotos: true),
);
Obtain the video from "Live Photos"
final AssetEntity entity = livePhotoEntity;
final String? mediaUrl = await entity.getMediaUrl();
final File? imageFile = await entity.file;
final File? videoFile = await entity.fileWithSubtype;
final File? originImageFile = await entity.originFile;
final File? originVideoFile = await entity.originFileWithSubtype;

Limitations

Android 10 media location permission

Due to the privacy policy issues on Android 10, it is necessary to grant the location permission to obtain the original data with the location info and the EXIF metadata.

If you want to use the location permission, add the ACCESS_MEDIA_LOCATION permission to your manifest.

Usage of the original data

The originFile and originBytes getter will return the original data of an entity. However, there are some cases that the original data is invalid in Flutter. Here are some common cases:

  • HEIC files are not fully supported across platforms. We suggest you to upload the JPEG file (99% quality compressed thumbnail) in order to keep a consistent behavior between multiple platforms. See flutter/flutter#20522 for more detail.
  • Videos will only be obtained in the original format, not the exported/composited format, which might cause some behavior difference when playing videos.
Long retrieving duration with file on iOS

There are several I/O methods in this library targeting AssetEntity, typically they are:

  • All methods named with file.
  • AssetEntity.originBytes.

File retrieving and caches are limited by the sandbox mechanism on iOS. An existing PHAsset doesn't mean the file located on the device. In generally, a PHAsset will have three status:

  • isLocallyAvailable equals true, also cached: Available for obtain.
  • isLocallyAvailable equals true, but not cached: When you call I/O methods, the resource will first cached into the sandbox, then available for obtain.
  • isLocallyAvailable equals false: Typically this means the asset exists, but it's saved only on iCloud, or some videos that not exported yet. In this case, the best practise is to use the PMProgressHandler to provide a responsive user interface.

Entities change notify

Plugin will post entities change events from native, but they will include different contents. See the logs folder for more recorded logs.

To register a callback for these events, use [PhotoManager.addChangeCallback] to add a callback, and use [PhotoManager.removeChangeCallback] to remove the callback, just like addListener and removeListener methods.

After you added/removed callbacks, you can call [PhotoManager.startChangeNotify] method to enable to notify, and [PhotoManager.stopChangeNotify] method to stop notify.

import 'package:flutter/services.dart';

void changeNotify(MethodCall call) {
  // Your custom callback.
}

/// Register your callback.
PhotoManager.addChangeCallback(changeNotify);

/// Enable change notify.
PhotoManager.startChangeNotify();

/// Remove your callback.
PhotoManager.removeChangeCallback(changeNotify);

/// Disable change notify.
PhotoManager.stopChangeNotify();

Cache mechanism

Cache on Android

Because Android 10 restricts the ability to access the resource path directly, image caches will be generated during I/O processes. More specifically, when the file, originFile and any other I/O getters are called, the plugin will save a file in the cache folder for further use.

Fortunately, on Android 11 and above, the resource path can be obtained directly again, but you can still use requestLegacyExternalStorage to access files in the storage without caching them. See Android 10+ (Q, 29) for how to add the attribute.

Cache on iOS

iOS does not directly provide APIs to access the original files of the album. So a cached file will be generated locally into the container of the current application when you called file, originFile and any other I/O getters.

If occupied disk spaces are sensitive in your use case, you can delete it after your usage has done (iOS only).

import 'dart:io';

Future<void> useEntity(AssetEntity entity) async {
  File? file;
  try {
    file = await entity.file;
    handleFile(file!); // Custom method to handle the obtained file.
  } finally {
    if (Platform.isIOS) {
      file?.deleteSync(); // Delete it once the process has done.
    }
  }
}

Clear caches

You can use the PhotoManager.clearFileCache() method to clear all caches that generated by the plugin. Here are caches generation on different platforms, types and resolutions.

Platform Thumbnail File / Origin File
Android Yes No
iOS No Yes

Native extra configs

Android extra configs

Glide issues

If your found any conflicting issues against Glide, then you'll need to edit the android/build.gradle file:

rootProject.allprojects {
    subprojects {
        project.configurations.all {
            resolutionStrategy.eachDependency { details ->
                if (details.requested.group == 'com.github.bumptech.glide'
                        && details.requested.name.contains('glide')) {
                    details.useVersion '4.15.1'
                }
            }
        }
    }
}

See ProGuard for Glide if you want to know more about using ProGuard and Glide together.

Android 13 (Api 33) extra configs

When targeting Android 13 (API level 33), the following extra configs needs to be added to the manifest:

<manifest>
    <uses-permission android:name="android.permission.READ_MEDIA_IMAGES" /> <!-- If you want to read images-->
    <uses-permission android:name="android.permission.READ_MEDIA_VIDEO" /> <!-- If you want to read videos-->
    <uses-permission android:name="android.permission.READ_MEDIA_AUDIO" /> <!-- If you want to read audio-->
</manifest>

iOS extra configs

Localized system albums name

By default, iOS will retrieve system album names only in English no matter what language has been set to devices. To change the default language, see the following steps:

  • Open your iOS project (Runner.xcworkspace) using Xcode. Edit localizations in Xcode 1

  • Select the project "Runner" and in the localizations table, click on the + icon. Edit localizations in Xcode 2

  • Select the adequate language(s) you want to retrieve localized strings.

  • Validate the popup screen without any modification.

  • Rebuild your flutter project.

Now system albums label should display accordingly.

Experimental features

Warning: Features here aren't guaranteed to be fully usable since they involved with data modification. They can be modified/removed in any time, without following a proper version semantic.

Some APIs will make irreversible modification/deletion to data. Please be careful and implement your own test mechanism when using them.

Preload thumbnails

You can preload thumbnails for entities with specified thumbnail options using PhotoCachingManager.requestCacheAssets or PhotoCachingManager.requestCacheAssetsWithIds.

PhotoCachingManager().requestCacheAssets(assets: assets, option: option);

And you can stop in anytime by calling PhotoCachingManager().cancelCacheRequest().

Usually, when we're previewing assets, thumbnails will be use. But sometimes we want to preload assets to make them display faster.

The PhotoCachingManager uses the PHCachingImageManager on iOS, and Glide's file cache on Android.

Delete entities

This method will delete the asset completely from your device. Use it with extra cautious.

// Deleted IDs will returned, if it fails, the result will be an empty list.
final List<String> result = await PhotoManager.editor.deleteWithIds(
  <String>[entity.id],
);

After the deletion, you can call the refreshPathProperties method to refresh the corresponding AssetPathEntity in order to get latest fields.

Copy an entity

You can use copyAssetToPath method to "Copy" an entity from its current position to the targeting AssetPathEntity:

// Make sure your path entity is accessible.
final AssetPathEntity anotherPathEntity = anotherAccessiblePath;
final AssetEntity entity = yourEntity;
final AssetEntity? newEntity = await PhotoManager.editor.copyAssetToPath(
  asset: entity,
  pathEntity: anotherPathEntity,
); // The result could be null when the path is not accessible.

The "Copy" means differently here on Android and iOS:

  • For Android, it inserts a copy of the source entity:
    • On platforms <=28, the method will copy most of the origin info.
    • On platforms >=29, some fields cannot be modified during the insertion, e.g. MediaColumns.RELATIVE_PATH.
  • For iOS, it makes a shortcut thing rather than create a new physical entity.
    • Some albums are smart albums, their content is automatically managed by the system and cannot insert entities manually.

(For Android 30+, this feature is blocked by system limitations currently.)

Features for Android only

Move an entity to another album
// Make sure your path entity is accessible.
final AssetPathEntity pathEntity = accessiblePath;
final AssetEntity entity = yourEntity;
await PhotoManager.editor.android.moveAssetToAnother(
  entity: entity,
  target: pathEntity,
);

(For Android 30+, this feature is blocked by system limitations currently.)

Remove all non-exist entities

This will remove all items (records) that's not existed locally. A record in Android MediaStore could have the corresponding file deleted. Those abnormal behaviors usually caused by operations from file manager, helper tools or adb tool. This operation is resource-consuming, Please use the await keyword to call the cleaning process before you call another one.

await PhotoManager.editor.android.removeAllNoExistsAsset();

Some operating systems will prompt confirmation dialogs for each entities' deletion, we have no way to avoid them. Make sure your customers accept repeatedly confirmations.

Features for iOS or macOS

Create a folder
PhotoManager.editor.darwin.createFolder(
  name,
  parent: parent, // Null, the root path or accessible folders.
);
Create an album
PhotoManager.editor.darwin.createAlbum(
  name,
  parent: parent, // Null, the root path or accessible folders.
);
Remove the entity entry from the album

Remove the entry of the asset from the specific album. The asset won't be deleted from the device, only removed from the album.

// Make sure your path entity is accessible.
final AssetPathEntity pathEntity = accessiblePath;
final AssetEntity entity = yourEntity;
final List<AssetEntity> entities = <AssetEntity>[yourEntity, anotherEntity];
// Remove single asset from the album.
// It'll call the list method as the implementation.
await PhotoManager.editor.darwin.removeInAlbum(
  yourEntity,
  accessiblePath,
);
// Remove assets from the album in batches.
await PhotoManager.editor.darwin.removeAssetsInAlbum(
  entities,
  accessiblePath,
);
Delete a path entity

Smart albums can't be deleted.

PhotoManager.editor.darwin.deletePath();

More Repositories

1

wechat_flutter

wechat_flutter is Flutter version WeChat, an excellent Flutter instant messaging IM open source library!
Dart
2,512
star
2

extended_image

A powerful official extension library of image, which support placeholder(loading)/ failed state, cache network, zoom pan image, photo view, slide out page, editor(crop,rotate,flip), paint custom etc.
Dart
1,908
star
3

NeteaseCloudMusic

Flutter - NeteaseCloudMusic Flutter 版本的网易云音乐
Dart
1,756
star
4

flutter_wechat_assets_picker

An image picker (also with video and audio) for Flutter projects based on the WeChat's UI.
Dart
1,500
star
5

flutter_smart_dialog

An elegant Flutter Dialog solution | 一种更优雅的 Flutter Dialog 解决方案
Dart
1,109
star
6

flutter_candies

custom flutter candies(widgets) for you to build flutter app easily, enjoy it
793
star
7

extended_text

A powerful extended official text for Flutter, which supports Speical Text(Image,@somebody), Custom Background, Custom overFlow, Text Selection.
Dart
650
star
8

flutter_image_compress

flutter image compress
Dart
638
star
9

extended_nested_scroll_view

extended nested scroll view to fix following issues. 1.pinned sliver header issue 2.inner scrollables in tabview sync issue 3.pull to refresh is not work. 4.do without ScrollController in NestedScrollView's body
Dart
595
star
10

extended_text_field

extended official text field to quickly build special text like inline image, @somebody, custom background etc.
Dart
573
star
11

FlutterJsonBeanFactory

What I do is generate dart beans based on json, as well as generics parameters and json build instances
Kotlin
567
star
12

flutter_custom_calendar

Flutter的一个日历控件
Dart
501
star
13

like_button

Like Button is a flutter library that allows you to create a button with animation effects similar to Twitter's heart when you like something and animation effects to increase like count.
Dart
466
star
14

flutter_scrollview_observer

A widget for observing data related to the child widgets being displayed in a ScrollView. Maintainer: @LinXunFeng
Dart
427
star
15

flutter_image_editor

Flutter plugin, support android/ios.Support crop, flip, rotate, color martix, mix image, add text. merge multi images.
Dart
410
star
16

flutter_wechat_camera_picker

A camera picker (take photos and videos) for Flutter projects based on WeChat's UI. It's a standalone module of wechat_assets_picker yet it can be run separately.
Dart
364
star
17

loading_more_list

A loading more list which supports ListView,GridView,WaterfallFlow and Slivers.
Dart
361
star
18

waterfall_flow

A Flutter grid view which supports waterfall flow layout.
Dart
358
star
19

JsonToDart

The tool to convert json to dart code, support Windows,Mac,Web.
Dart
356
star
20

extended_tabs

A powerful official extension library of Tab/TabBar/TabView, which support to scroll ancestor or child Tabs when current is overscroll, and set scroll direction and cache extent.
Dart
267
star
21

ncov_2019

An online query App for COVID-19 statistics developed by Flutter was used.
Dart
255
star
22

flutter-interactive-chart

A candlestick chart that supports pinch-to-zoom and panning.
Dart
210
star
23

pull_to_refresh_notification

Flutter plugin for building pull to refresh effects with PullToRefreshNotification and PullToRefreshContainer quickly.
Dart
187
star
24

flutter_drawing_board

A new Flutter package of drawing board
Dart
180
star
25

extended_sliver

A powerful extension library of Sliver, which include SliverToNestedScrollBoxAdapter, SliverPinnedPersistentHeader, SliverPinnedToBoxAdapter and ExtendedSliverAppbar.
Dart
166
star
26

flutter_interactional_widget

Dart
163
star
27

extended_image_library

package library for extended_image, extended_text and extended_text_field,provide common base class.
Dart
154
star
28

flutter_tilt

👀 Easily apply tilt parallax hover effects for Flutter, which supports tilt, light, shadow effects, and gyroscope sensors | 为 Flutter 轻松创建倾斜视差悬停效果,支持倾斜、光照、阴影效果和陀螺仪传感器
Dart
144
star
29

ff_annotation_route

Provide route generator to create route map quickly by annotations.
Dart
122
star
30

flutter_filereader

Flutter实现的本地文件(pdf word excel 等)查看插件,非在线预览
Dart
109
star
31

nav_router

flutter The lightest, easiest and most convenient route management!
Dart
103
star
32

w_popup_menu

w_popup_menu # A pop-up menu that mimics the iOS WeChat page
Dart
89
star
33

flutter_asset_generator

Generate an R file for mapping all assets. Supports preview of image.
Dart
86
star
34

stack_board

层叠控件摆放
Dart
85
star
35

left-scroll-actions

Flutter的左滑删除组件
Dart
82
star
36

extended_text_library

extended_text_library for extended_text and extended_text_field
Dart
75
star
37

flutter_hsvcolor_picker

An HSV color picker designed for your Flutter app. Pickers: RGB, HSV, Color Wheel, Palette Hue, Palette Saturation, Palette Value, Swatches.
Dart
71
star
38

flex_grid

The FlexGrid control provides a powerful and quickly way to display data in a tabular format. It is including that frozened column/row,loading more, high performance and better experience in TabBarView/PageView.
Dart
60
star
39

no-free-usage-action

A NO-FREE-USAGE action for github. (Only worked with github action.)
Dart
60
star
40

extended_list

extended list(ListView/GridView) support track collect garbage of children/viewport indexes, build lastChild as special child in the case that it is loadmore/no more item and enable to layout close to trailing.
Dart
51
star
41

fconsole

一个用于调试的面板
Dart
50
star
42

flutter_juejin

https://juejin.cn in Flutter
Dart
48
star
43

gitcandies

A GitHub Flutter application.
Dart
47
star
44

flutter_ali_auth

Flutter Ali Auth Plugin 阿里云一键登录Flutter插件
Java
47
star
45

ripple_backdrop_animate_route

A ripple animation with backdrop of route.
Dart
45
star
46

flutter_apodidae

🔥🔥 收录 Flutter 优化合集,apodidae (雨燕)是飞翔速度最快的鸟类,与 flutter (颤动)不谋而合。
40
star
47

flutter_bdface_collect

a baidu face offline collect plugin. Only Android and IOS platforms are supported. 百度人脸离线采集插件,只支持安卓和iOS。
Objective-C
38
star
48

flutter_record_mp3

flutter record mp3 using the native api
Dart
34
star
49

assets_generator

The flutter tool to generate assets‘s configs(yaml) and consts automatically for single project and multiple modules.
Dart
34
star
50

flutter_qweather

和风天气 Flutter 插件
Dart
29
star
51

flutter_draggable_container

A Draggable Widget Container
Dart
28
star
52

baidupan

Baidu net disk api for dart, 百度网盘的 dart 库
Dart
28
star
53

flutter_switch_clipper

A Flutter package that two widgets switch with clipper.
Dart
26
star
54

dash_painter

a package for flutter canvas paint dash line path easily.
Dart
25
star
55

http_client_helper

A Flutter plugin for http request with cancel and retry fuctions.
Dart
25
star
56

flutter_live_activities

Flutter Live Activities Plugin
Dart
23
star
57

flutter_slider_view

A slider view widget that supports custom type models and various configs.
Dart
22
star
58

packages

Custom Flutter Candies (packages) for you to easily build your Flutter app. Enjoy it!
20
star
59

extra_hittest_area

Manually add the extra hitTest area of a widget without changing its size or layout.
Dart
18
star
60

flutter_learning_tests

学习 Flutter 路上的点滴及小测~
Dart
17
star
61

ios_willpop_transition_theme

A Flutter package to solve the conflict between ios sliding back and Willpop
Dart
17
star
62

saver_gallery

Kotlin
15
star
63

flutter_mlkit_scan_plugin

Kotlin
15
star
64

should_rebuild

Dart
14
star
65

candies_analyzer_plugin

The plugin to help create custom analyzer plugin quickly and provide some useful lints and get suggestion and auto import for extension member.
Dart
14
star
66

flutter_novel

一款开源免费的在线小说阅读app,使用flutter进行开发
Dart
13
star
67

flutter_candies_gallery

flutter_candies
Dart
12
star
68

scan_barcode

Barcode/QRCode scan, base of google mikit.
Dart
12
star
69

CandiesBot

Java
11
star
70

flutter_float_window

flutter_float_window是一个悬浮窗插件,具备悬浮窗权限申请等功能
Java
11
star
71

extended_list_library

package library for extended_list and waterfall_flow, it provides core classes.
Dart
10
star
72

photo_widget

Base on photo_manager, wraps up some UI components to quickly display the photo_manager as a usable widget, inserting it wherever you need it.
Dart
10
star
73

extended_keyboard

Flutter plugin for create custom keyboards quickly.
Dart
10
star
74

flutter_app_build_tool

A CLI tool that helps to build Flutter apps.
Dart
9
star
75

douget

Dart
9
star
76

coordtransform

A coord transform tool. 提供百度坐标系(BD-09)、火星坐标系(国测局坐标系、GCJ02)、WGS84坐标系的相互转换。
Dart
9
star
77

ff_native_screenshot

A Flutter plugin to take or listen screenshot(support Platform Views) for Android and iOS with native code.
Java
9
star
78

flutter_custom_inspector

A customizable inspector that can called directly through Flutter apps.
Dart
8
star
79

adaptation

Screen for adaptation.
C++
8
star
80

properties

Load properties format in dart or flutter
Dart
7
star
81

w_reorder_list

Dart
7
star
82

JsonToDartWeb

JsonToDart Web 带字体文件
7
star
83

flutter_candies_demo_library

package library for demo of flutter candies, it provides core classes.
Dart
7
star
84

sync_scroll_library

The library for extended_tabs and flex_grid
Dart
6
star
85

env2dart

A simple way to generate `dart` code from a `.env` file.
Dart
6
star
86

loading_more_list_library

dart package library for LoadingMoreList, it provides core classes.
Dart
6
star
87

ff_annotation_route_library

The library for ff_annotation_route
Dart
5
star
88

dext

Some extension for dart
Dart
5
star
89

flutter_clean

help clean all of Flutter and Dart projects
Dart
4
star
90

flutter_challenges

Just do the first one, don't do second who.
Dart
4
star
91

flutter_candies_package_tools

tool to create package and demo
Dart
4
star
92

simple_provider

flutter simple provider
Dart
3
star
93

upgrade_tool

Resolve warnings caused by xxxbinding. Instance in Flutter 3.0
Dart
3
star
94

note_edit

A library of flutter note editor plugins.
Dart
2
star
95

blue_flutter

blue_flutter是flutter的蓝牙通讯插件
Java
2
star
96

ff_annotation_route_core

The core library for ff_annotation_route
Dart
2
star
97

mvimg

For get video from motion photo for android.
Dart
2
star
98

dart_wake_on_lan

A CLI application to send Wake-On-Lan packets.
Dart
2
star
99

.github

2
star
100

maven

Organizational maven deploy;组织的maven仓库;
1
star