WASM compatibility fix.
- Removed
photo_managerimports from web/WASM-reachable code (limited_access_picker_stub.dartandadaptive_media_picker_impl.dart). The stub'sLimitedAccessPicker.shownow returnsFuture<List<dynamic>?>instead of namingAssetEntity, which transitively pulleddart:iointo web builds and made pub.dev flag the package as not WASM-compatible. The native (dart:io) implementation is unchanged and still returnsList<AssetEntity>.
SDK constraint fix.
- Environment
- Raised minimum SDKs to Dart 3.10 / Flutter 3.38.1 — required by
image_picker1.2.3 anddevice_info_plus13. The previous constraints (Dart 3.4 / Flutter 3.13) could not actually resolve the 1.0.0 dependencies.
- Raised minimum SDKs to Dart 3.10 / Flutter 3.38.1 — required by
- CI
- Bumped the CI Flutter version to 3.44.9 (matching the
.fvmrcpin) so dependency resolution succeeds on CI
- Bumped the CI Flutter version to 3.44.9 (matching the
First stable release: dependency upgrades, accurate permission states, and WASM compatibility.
- Dependencies
- Updated
smart_permissionfrom^0.0.3to^1.0.1 - Updated
image_cropperfrom^11.0.0to^12.2.1 - Updated
device_info_plusfrom^12.2.0to^13.2.0 - Updated
photo_managerfrom^3.7.1to^3.12.0 - Updated
image_pickerfrom^1.2.1to^1.2.3 - Android apps must now build with
compileSdk = 37(required bypermission_handler13 viasmart_permission); see README
- Updated
- Permission handling
- Migrated to
smart_permission's result API: limited access and permanently-denied states are now reported accurately by the OS instead of being inferred from the device's photo library contents. Full-access users now get the native picker instead of the in-package limited-access sheet. PermissionResolution.permanentlyDeniedis now populated correctly- The "Open Settings" flow (dialog, opening Settings, waiting for return,
re-checking) is handled by
smart_permission; the package no longer shows its own duplicate settings dialog.PickOptions.settingsDialogTitle,settingsDialogMessage,settingsButtonLabel, andcancelButtonLabelare forwarded to those dialogs. - Deprecated
PickOptions.showOpenSettingsDialog(no longer read) - Android 13+: video picks now request only
READ_MEDIA_VIDEO(previously also prompted for images)
- Migrated to
- Results
- Added
PickError.permissionDenied; permission failures no longer surface asPickError.unknown PickResultMultiplenow exposeserror(parity withPickResultSingle)- Fixed: crop cancellation on non-web platforms now sets
PickError.cropCanceled(previously alwaysnull)
- Added
- Web
- Conditional imports now use
dart.library.js_interopinstead ofdart.library.htmlfor WebAssembly (WASM) compatibility
- Conditional imports now use
Permission handling migration and dependency updates.
- Breaking Changes
- Replaced
permission_handlerwithsmart_permissionpackage PermissionManager.ensureMediaPermissionnow requiresBuildContext?parameter
- Replaced
- Dependencies
- Updated
device_info_plusfrom^12.1.0to^12.2.0 - Updated
image_pickerfrom^1.2.0to^1.2.1 - Replaced
permission_handler: ^12.0.1withsmart_permission: ^0.0.3
- Updated
- Permission Manager
- Migrated to
smart_permissionAPI for better permission handling UX - Added context-aware permission requests with proper mounted checks
- Improved Android granular media permissions handling (API 33+)
- Enhanced iOS Photos permission flow with limited access detection
- Migrated to
- Documentation
- Added iOS Podfile configuration section with permission setup instructions
- Updated README with Podfile
post_installconfiguration for Camera, Microphone, and Photos permissions
Dart formatting only (no functional changes).
- Formatting
- Ran
dart formatwith default settings acrosslib/,example/, andtest/ - Ensures pana/pub.dev formatter compliance
- Ran
Web image cropper bug fixes and improvements.
- Web Image Cropper
- Fixed "Type 'Brightness' not found" error
- Added input validation and better error handling
- Enhanced debugging with detailed logging
Theming support and example toggle.
- Options
- Added
PickOptions.themeBrightnessandPickOptions.primaryColorto control UI theme for the limited-access sheet and cropper
- Added
- Limited-access UI
- Bottom sheet now uses app theme by default; can be overridden via
PickOptions
- Bottom sheet now uses app theme by default; can be overridden via
- Cropping (Android/iOS/Web)
- Android:
AndroidUiSettingscolors now derive from theme (toolbar, controls, dim layer, grid/frame) - Web: forwards theme context; respects app theme for dialog/page
- Android:
- Example
- Added light/dark theme switch and wired theme overrides into picker calls
- Docs
- README updated with theming section and usage
Non-breaking DX improvements: typed errors and richer result metadata.
- Results
PickResultSinglenow exposesmetadata: PickMetadatawith:cropApplied,originalSize, andfinalSize(when measurable)
- Added
error: PickError?to disambiguate empty results:canceled(user canceled),cropCanceled,io,unknown
- Options
PickOptions.logTag(optional) for easier internal tracing in debug logs
- Behavior
- Populates
originalSizeandfinalSizefor single-image picks (incl. cropped) - Sets
PickError.canceledwhen selection dialogs return null/empty - Sets
PickError.cropCanceledwhen crop UI is dismissed without saving
- Populates
- Analyzer
- Guarded context across async gaps where size decoding/crop occurs
Cropping feature finalized with platform guards, stubs, and docs updates:
- Feature: Optional cropping for single image picks (
PickOptions.wantToCrop)- Supported on Android, iOS, Web
- No-op on Desktop (macOS, Windows, Linux) — returns original image
- Limited access: Cropping now works when selecting from the limited-access picker (single image)
- Android: Ensure
UCropActivityis declared in app manifest (documented) - Web: Uses
image_cropper(cropperjs) with dialog style and fixed size; requires including CSS/JS inindex.html - Internals:
- Introduced
PlatformImageCropperwith conditional imports for mobile/web and a desktop stub - Removed direct
ImageCropperusage from the picker; unified call sites - Fixed analyzer issues: context guards (mounted checks), removed custom aspect ratio type
- Introduced
Analyzer and formatting cleanups; no API changes:
- Lints
- Resolved "Dangling library doc comment" by adjusting comments in
lib/adaptive_media_picker.dart - Ensured analyzer passes with no issues on the library entrypoint
- Resolved "Dangling library doc comment" by adjusting comments in
- Formatting
- Ran
dart formatacross the repository (lib and example) for pub.dev checks
- Ran
- Tests
- Verified package and example tests pass under FVM
- Public API
- No functional or breaking changes
Docs and README polish; tests and formatting:
- Docs
- Added dartdoc across public API (picker, models, limited-access UI)
- Removed duplicated/ambiguous comments for clearer generated docs
- Public API
- Cleaned exports in
adaptive_media_picker.dart(no breaking changes)
- Cleaned exports in
- Tests & formatting
- Updated example test to use the public entrypoint
- Ran
dart formaton lib to satisfy pub.dev checks
- Internals
- Minor refactors and comments only; no runtime behavior changes
Refactor, clearer API, and docs/readiness improvements:
- New concrete result types returned directly:
PickResultSingle { item, permissionResolution }PickResultMultiple { items, permissionResolution }
- New public methods:
pickImage(single image),pickVideo(single video),pickMultiImage(multi images)
PickOptionssimplified:- Removed
allowMultipleandmediaType maxImagesnow applies only to images and is enforced cross-platform
- Removed
- Limited access bottom sheet UX:
- Closes by default after Manage/Open Settings when no items are visible
- Codebase reorg:
src/core/(models),src/platform/(permission manager),src/ui/(limited picker)
- Web compatibility: removed
dart:iofrom library code - README overhauled (quick start, use cases, API overview)
- Tests updated; FVM test run green
Initial release
- Adaptive media picker with unified API across platforms (Android, iOS, Web, Desktop).
- Permission handling via
permission_handler, including:- Android 13+ granular Photos/Videos permissions and limited access detection.
- iOS Photos limited/full access handling with settings prompt.
- Desktop: treated as granted; relies on system file dialogs.
- Limited access flow with built-in bottom-sheet picker powered by
photo_manager. - Image/video picking backed by
image_pickerwith desktop/web camera fallback to gallery. - Options for multi-select, max image count, and image quality/size hints.
- Re-exports
ImageSourcefor consumer convenience. - Example app demonstrating common flows and UI states.
- Test suite (package and example) and FVM compatibility.