flutter_assistant_intents 1.4.0
flutter_assistant_intents: ^1.4.0 copied to clipboard
Expose task-app actions to voice assistants — iOS App Intents (Siri, Spotlight, Shortcuts) and Android app shortcuts — with typed Dart handlers.
Changelog #
All notable changes to this project will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
1.4.0 - 2026-08-24 #
Added #
- Confirmation prompts (iOS 26+). A handler can answer with
AssistantTaskResult.needsConfirmation(dialog:, options:)instead of an outcome. The assistant speaks the question, offers theAssistantChoiceoptions, and calls the same handler again with the picked option's id inrequest.choice. Backed by therequestChoice(between:dialog:)API introduced in the iOS 26 App Intents framework. AssistantChoiceandAssistantChoiceStyle(normal,destructive,cancel), plus the sharedAssistantChoice.canceloption. Unknown style names decode tonormal, so a newer native side cannot break an older Dart side.choiceonAddTaskRequest,CompleteTaskRequestandAssistantActionRequest: null on the first call, the chosen option id on the follow-up.AppIntentConfirmingon the Swift side. The built-in intents adopt it; host apps declaring their own intents add the conformance and passconfirming: selftoAssistantIntentBridgeto get prompts too.
Changed #
flutter_lintsraised to^6.0.0; the package analyzes clean under the stricter rule set.
Notes #
- Where a prompt cannot be shown (iOS below 26, Android shortcuts, or a call
site that passes no intent), the action stays unperformed and the
assistant speaks the
fallbackMessage. That is the safe default for the destructive operations confirmations are meant for. - A single intent run resolves at most 3 confirmation rounds, so a handler that keeps asking cannot trap the user in a dialog loop.
1.3.1 - 2026-07-14 #
Added #
- Generator cleanup: previously generated files are tracked in a manifest
(
.dart_tool/flutter_assistant_intents/outputs.json); when output paths change, stale files are deleted and theirproject.pbxprojentries removed — but ONLY files still carrying the// GENERATED by …marker. Hand-written files at old paths are never touched.
1.3.0 - 2026-07-14 #
Fixed #
- Siri routed "Add a task in Siri's
built-in Reminders domain claims utterances that open with "add/create a
task", so the trailing app name never reached
AddTaskIntent. The add-task shortcut now also advertises app-name-first phrases ("Add a
[1.3.0] - 2026-07-14 #
Added #
- YAML-driven code generation (
dart run flutter_assistant_intents:generate): declare actions once inassistant_intents.yamland the tool generates the Runner's Swift App Intents (typed parameters, Siri phrases, task preset aspackagere-export orwrappers), registers the file inproject.pbxproj(idempotent), and emits Dart glue (action-id constants +generatedAndroidShortcuts).--initscaffolds a starter config; validation enforces Apple's phrase-token and 10-shortcut rules. - New dependency:
yaml(used by the generator CLI).
1.2.0 - 2026-07-13 #
Added #
- Swift Package Manager support on iOS (dual with CocoaPods): sources
moved to
ios/flutter_assistant_intents/Sources/…with aPackage.swift; the podspec points at the same sources, so both integrations work.
1.1.0 - 2026-07-13 #
Added #
- iOS cold-start support: the plugin can boot a headless
FlutterEnginewhen Siri runs an intent while the app process is not alive. Enable withFlutterAssistantIntentsPlugin.setPluginRegistrantCallback(optionally with a dedicated Dartentrypoint); ahandlers.synchandshake removes the engine-boot race.
1.0.0 - 2026-07-13 #
First stable release — API considered stable from here on (SemVer).
Changed #
- Promoted 0.1.0 to stable with no API changes: task preset
(
onAddTask/onCompleteTask/onQueryTasks) + generic action layer (onAction, custom iOS intents viaAssistantIntentBridge.performAction, Dart-defined custom Android shortcuts).
0.1.0 - 2026-07-13 #
Added #
- Typed Dart handler API:
AssistantIntents.instance.registerHandlers(...)with optionalonAddTask,onCompleteTask,onQueryTaskscallbacks (task preset) and a genericonActioncallback for app-defined actions. - Typed models:
AddTaskRequest,CompleteTaskRequest,QueryTasksRequest,AssistantActionRequest,AssistantTask,AssistantTaskResult,TaskQueryFilter,AndroidShortcutsConfig,AndroidCustomShortcut. - iOS (16+): App Intents implementation —
AddTaskIntent(title, due date, notes),CompleteTaskIntent,QueryTasksIntent, anAppShortcutsProviderwith app-name-based invocation phrases (short titles + SF Symbols), andFlutterAssistantIntentsPackage(AppIntentsPackage) for host re-export. - iOS: public
AssistantIntentBridge.performAction(id:parameters:)so host apps can declare custom intents with their own Siri phrases whose logic lives in Dart; hard 10 s timeout on every Dart round-trip so a silent handler can never hang Siri. - Android: dynamic app shortcuts ("Add task", "Today") published additively
via
ShortcutManagerCompat.pushDynamicShortcut(host shortcuts are never replaced), with icons and ranks; fully Dart-defined custom shortcuts routed toonAction. updateShortcuts()— no-op-safe refresh of platform shortcut donations with configurable Android labels, task-preset opt-out and custom shortcuts.- Runnable
example/app (Android + iOS hosts) demonstrating the task preset, the generic action layer and the required iOSAppIntentsPackagere-export. - Dart-layer tests with a mocked method channel.