NewYour coding agent can read the release notes before it upgrades.Set up the MCP server →
pub.dev · #754 most downloaded on pub.dev
Fast, complete contact management for Android, iOS & macOS — all fields, groups, accounts, vCards, native dialogs, listeners, SIM contacts, and number blocking.
Last release 5 days ago
03 Oct 2026
Ships unpredictably
gaps range from 9 days to 1.5 years
Nearly every release is documented
notes for 54 of 54 stable releases
Nothing withdrawn
no release was ever pulled
6 years old
59 releases · first in 2020
Fix Android's contacts provider crashing (and photos being lost) when many photos are written at once, e.g. createAll() with photos. Bulk photo writes
createAll() with photos. Bulk photo writes
are also several times faster, and photos are visible when the call returns.get() returns null for a missing contact instead of
throwing.Label(XLabel.custom, 'text'), as on Android.ContactFilter.ids([]) throwing on iOS/macOS.groups.get() returning deleted groups on Android.security_error, as
documented.showCreator() prefill on Android for phonetic names, nicknames and
addresses.update() and updateAll() now throw read_only_contact instead of silently dropping properties owned by a sync adapter, which Android's provider filters
update() and updateAll() now throw read_only_contact instead of silently
dropping properties owned by a sync adapter, which Android's provider filters
out of the write — thanks @yassinsameh for the request (#95, #260).One column per quarter.
Reject a second showCreator() call on iOS while one is already presented, which previously left the first call's future unresolved.
showCreator() call on iOS while one is already presented,
which previously left the first call's future unresolved.showEditor() also returns null when the contact is deleted
from the system editor, not only when the user cancels.showEditor() on iOS now waits for the user to finish instead of resolving to null immediately; it returns the contact identifier on save.
showEditor() on iOS now waits for the user to finish instead of resolving to
null immediately; it returns the contact identifier on save.19960415, --0415), which vCard 4.0 mandates and Android's vCard importer
stores verbatim — thanks @Ruman87 for the report and diagnosis (#248).groups.addContacts() failing with Group has no account on Android 12
and below, where the platform exposes no default account and groups.create()
produces a local group — thanks @Eunno-An for the report (#247).Co-authored-by: Claude Fable 5 noreply@anthropic.com
Co-authored-by: Claude Fable 5 noreply@anthropic.com
showCreator() name prefill not displaying in some Android contact
editors (e.g. Samsung) by passing Insert.NAME instead of a StructuredName
row — thanks @CrashKiki for the fix (#241) and @Eunno-An for the report
(#242).Co-authored-by: Claude Fable 5 noreply@anthropic.com
Co-authored-by: Claude Fable 5 noreply@anthropic.com
IN_VISIBLE_GROUP = 1: contacts from sync adapters
that don't mark them visible (e.g. MS365/Exchange) are included in getAll(),
operations by ID work regardless of visibility, and filters matching no
contacts return none instead of all (#240).showCreator() dropping the pre-filled photo on Android: the system
editor ignores photos passed through the insert intent, so the photo is now
applied to the contact after creation when the app holds WRITE_CONTACTS
(#242).- Update README.
Fix name updates writing to the wrong raw contact on Android contacts with multiple raw contacts (e.g. Google + WhatsApp): the name is now updated in
Round-trip unknown vCard properties via contact.extras (#21).
contact.extras (#21).FlutterContacts.native.showPicker() now returns Contact? (with id and displayName always populated) and accepts a properties: set for additional field
FlutterContacts.native.showPicker() now returns Contact? (with id and
displayName always populated) and accepts a properties: set for additional
fields. The picker itself remains permissionless on both platforms; on Android,
requesting properties requires READ_CONTACTS and throws otherwise.
Breaking: replace await …showPicker() with (await …showPicker())?.id (#232).Fix Flutter SDK path resolution for FVM and IDE sync compatibility
The plugin's build.gradle assumed local.properties was always in
rootProject.projectDir, which breaks under FVM setups and certain IDE
sync scenarios where the working directory differs.
Resolution now:
This makes the plugin build reliably across normal Flutter, FVM, and
IDE-triggered Gradle sync without requiring user workarounds.
Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com
When the plugin is resolved from ~/.pub-cache, walking up from
project.projectDir cannot reach the host app's local.properties.
Add rootProject.projectDir lookup and support for the flutter-root
Gradle property (passed by Flutter tooling during builds) to cover
this case.
Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com
Co-Authored-By: Claude Opus 4.6 (1M context) noreply@anthropic.com
Co-authored-by: Claude Opus 4.6 (1M context) noreply@anthropic.com
Fix Android build failure from hardcoded Flutter SDK path
Release stable version 2.0.0, incorporating all changes from beta ver…
Release stable version 2.0.0, incorporating all changes from beta ver…
Relax Dart/Flutter version requirements
Migrate to Swift Package Manager
Disable Swift Package Manager for example app
Expose Android identifiers and timestamp, refactor Android-specific f…
Expose Android identifiers and timestamp, refactor Android-specific f…
androidLookup parameter to get()Complete rewrite with improved architecture and performance
Fix openExternalInsert returning null on android
Fix wrong namespace on android (https://github.com/QuisApp/flutter_contacts/issues/171) - thanks mattmapadmi
Fix kotlin/android incompability issues with java 1.8 and java 17 (https://github.com/QuisApp/flutter_contacts/issues/142, https://github.com/QuisApp/
Upgrade gradle, add null-safety in example_full.
Fix for AGP <4.2 (https://github.com/QuisApp/flutter_contacts/issues/127) - thanks trfiladelfo
Add feature to pre-populate fields in openExternalInsert() - thanks sakchhams
- Update kotlin/gradle versions
- Fix null pointer error (https://github.com/QuisApp/flutter_contacts/pull/71 - thanks anggrayudi) - Update README
Edit groups (iOS) / labels (Android) and group/label membership
- Fix gradle compile error
Fix social media custom label bug
Read/write starred contacts on Android
- Update README
- Update comments
Fetch groups (iOS) / labels (Android) and containers (iOS) / accounts (Android)
- Fix a diacritics bug
- Fix hashCode and ==
- Fix withThumbnail on iOS
Load rawContact instead of contactId after update, since Android sometimes changes the contactId
Add ability to open external contact app to view, edit, pick or insert contacts
Fix for permission handler on Android (https://github.com/QuisApp/flutter_contacts/pull/17) - thanks @scroollocker
Follow-up fix for https://github.com/QuisApp/flutter_contacts/issues/9
Fix https://github.com/QuisApp/flutter_contacts/issues/9
- Fix lint warning
- Remove unused dependency
Change Dart SDK version requirements
- Migrated to null-safety
Support for requesting permissions
- Format
Photo and thumbnail are now distinct fields
Event.date is now Event.year, Event.month, Event.daycontact.insert(), contact.update(), contact.delete()build_runner and json_serializabletoString(), hashCode and operator== for contact and propertiesFlutterContacts.config.includeNotesOnIos13AndAbove = true- Remove extra print statements
- Properly delete events on iOS
Fix date serialization on Android
Support for vCard parsing and exporting
pedantic static analyzersocialMedia.dart -> social_media.dartBug fix with normalized phone number
Added normalized phone numbers (android only)
Added option to getFullContacts() with high-res photos.
getFullContacts() with high-res photos.newContact() now returns the full contact instead of ID / raw ID.
newContact() now returns the full contact instead of ID / raw ID.- Fix README typos.
- Fix support for iOS.
- Initial release.
Your coding agent can read these notes before it upgrades. Set up the MCP server →