feedback_kit 0.3.0
feedback_kit: ^0.3.0 copied to clipboard
In-app feedback boards, voting and a public roadmap for Flutter. Auth-agnostic: bring your own identity via a FeedbackIdentityProvider, or let the built-in anonymous device identity handle it. Pairs w [...]
0.3.0 #
Multiple choice, and submit forms that speak the reader's language.
- Multiple choice. A board field of type
multiselectrenders as a list of tick boxes and submits a list of values. Boxes rather than a multi-select dropdown because every option has to be reachable with one thumb, and the choices stay visible while the next one is made. - Translated forms. A board's labels, categories and option wording now arrive
already in the reader's language — the service resolves them against the same
Accept-Languagetag the kit already sends, so nothing here has to know which languages a board was translated into.SubmitFormField.optionLabelscarries the wording next to the untranslatedoptions; the values themselves stay canonical, so an answer means the same thing whatever language it was given in.
Both are additive: a board that uses neither renders exactly as before, and an unknown field type still degrades to a text field rather than crashing.
Needs the Feedback service from 2026-07-31 or later. Against an older one,
optionLabels is simply absent and each option shows its own value — which is what
it did before this release.
0.2.0 #
Screenshots, downvoting, and the app's own language.
- Language follows the operating system.
FeedbackStringsships full translations for 27 locales, and the client sends the resolved tag asAccept-Languageon every request — so the in-app strings, the board payload and the status mails all land in the same language.FeedbackConfig.localeforces one when the host app has its own switch. - Screenshots.
FeedbackConfig.imagePickeris a seam, not a dependency: the kit never pulls inimage_picker, because that would force its platform plugins and permission entries on every host app — most of which, like MyMovement, already have one. A three-line adapter is in the docs. Leave it null and the attach button simply does not appear. - Downvoting.
vote(postId, value: 1 | -1 | 0)replacesvote(postId, on: bool).FeedbackPost.voteCountis now the net score and may be negative where a board allows push-back;upvoteCountanddownvoteCountcarry the split.viewerHasVotedremains as a derived getter, so read-only callers keep compiling. - Rich content. Attachments and emoji reactions render on the post and list
views;
FeedbackAttachment.urlFrom(baseUrl)turns the service's path into a URL. - Custom submit forms. A board's own labels, categories and extra fields are rendered from its configuration — changing the form needs no app release. An unknown field type degrades to a text field rather than crashing.
Breaking #
vote(postId, on: bool)→vote(postId, value: int).VoteButtontakesviewerVote/onVoteinstead ofhasVoted/onPressed, plus a requiredstrings.PostTile,FeedbackSubmitScreen,FeedbackPostScreenandFeedbackRoadmapScreentake a requiredstrings. Callers usingFeedbackBoardScreen— the documented entry point — are unaffected: it supplies them.
Fixed #
- Attachment uploads went through a one-off HTTP client instead of the one passed to
FeedbackClient, silently bypassing a host app's proxy, certificate pinning or request logging for uploads only.
0.1.1 #
- New
FeedbackChangelogScreen, reachable fromFeedbackBoardScreenwhenever the board has its changelog enabled. The client and theChangelogEntrymodel shipped in 0.1.0, but nothing rendered them — and the board screen's documentation claimed a changelog view that did not exist. - Entries are sorted newest-first client-side and dated absolutely, with a relative hint only for the last week: a changelog is a record, and "vor 84 Tagen" rots in a screenshot.
- A board without a public changelog (the service answers 404) is presented as a configuration state, not as an error.
0.1.0 #
First release.
FeedbackClientover the platform Feedback service's public API: board config, paged posts, post detail with comments, voting, commenting, roadmap, changelog.- Two identity modes behind one seam.
AnonymousDeviceIdentitygenerates and persists a device token with no backend involved;CallbackIdentityProvidercarries a token your own backend signed with the board's key. The package never holds the signing key and never signs. - One transparent refresh-and-retry on an expired token, so a user is not told their session lapsed mid-tap.
- Typed failures (
FeedbackException.failure) so a signed-out visitor, a stale token and a rate limit can be told apart. - Screens:
FeedbackBoardScreen,FeedbackPostScreen,FeedbackSubmitScreen,FeedbackRoadmapScreen, plusPostTile/VoteButton/StatusChipfor hosts that want their own layout. - Optimistic voting that reverts on failure.
- Unknown status values from a newer service degrade to
openinstead of throwing.