
WishKit has no Flutter package. Canny on Flutter is a WebView plus SSO. UserOrient already sells “Flutter SDK, not a website.” That is the right fight. The extra move is the agent loop: the report has to be something Cursor can ship, not a title on a hosted page.
RN: SDK vs WebView vs Canny · WishKit alternative for Android · Does Canny have a mobile SDK?.
What “without a WebView” means
| Dart package | WebView of Canny / Featurebase / Nolt | WishKit | |
|---|---|---|---|
| Install | feedbackjar: ^1.6.1 in pubspec | webview_flutter + board URL | No Flutter artifact |
| UI | FeedbackJarBoard (Material) or your widgets | Their website | n/a |
| Login to vote | Optional setIdentity | Hosted login or SSO | — |
| Metadata | OS, model, screen, app version, locale | User-Agent | — |
| Both stores | One package, one widget ID | One URL, two problems | iOS only |
| Agent | MCP reads the post + device fields | A Canny card with no OS | — |
If pubspec.yaml does not get a package name, you do not have a Flutter feedback SDK.
The WebView path (skip it)
WebViewWidget(controller: controller..loadRequest(
Uri.parse('https://your-company.canny.io'),
)); You inherit cookie banners, popup auth, and a theme that fights Theme.of(context). Canny’s official mobile recipe still wants a JWT minted on your server. Details.
Nolt’s help center says Android/iOS embeds are unofficial. Flutter is not more official.
The Dart package
Package: feedbackjar on pub.dev (^1.6.1)
Repo: github.com/feedbackjar/flutter-sdk
Docs: Flutter SDK
Dart 3 / Flutter 3.10+
dependencies:
feedbackjar: ^1.6.1 import 'package:feedbackjar/feedbackjar.dart';
void main() {
WidgetsFlutterBinding.ensureInitialized();
FeedbackJar.configure('your-widget-id');
runApp(const MyApp());
} Drop-in board:
FeedbackJarBoard(accentColor: Color(0xFFE5484D));
// or
showFeedbackJar(context, accentColor: Color(0xFFE5484D)); Settings row, not a fourth tab, not shake:
ListTile(
leading: Icon(Icons.lightbulb_outline),
title: Text('Feature requests'),
onTap: () => showFeedbackJar(context),
) Identity after login:
await FeedbackJar.shared.setIdentity(name: user.name, email: user.email);
// logout
await FeedbackJar.shared.clearIdentity(); Own screen if you hate the prebuilt one:
final listed = await FeedbackJar.shared.listFeedback(limit: 20);
await FeedbackJar.shared.vote(postId);
await FeedbackJar.shared.submit(
userText,
properties: {'plan': 'pro'},
); Same widget ID as Swift and Kotlin. Flutter, iOS, and Play share one vote count.
UserOrient and the rest of the Flutter shelf
UserOrient is a real Flutter-native board. Wiredash is closer to shake-to-report. pick a feature is Flutter-only voting.
Pick UserOrient if you want Flutter-only and their dashboard. Pick FeedbackJar if you also ship a Swift or Kotlin binary — or you want MCP so an agent can close the loop.
Do not pick WishKit and wrap wishkit.io in webview_flutter. That is the WebView column with extra steps. WishKit alternative.
The agent loop (the part UserOrient is not selling)
A Flutter WebView of Canny gives the agent a title. A Dart submit attaches OS, model, screen, app version, locale. That is the difference between “add widgets” and “add widgets, Android 14, Pixel 8, app 3.2.1.”
Then:
- Cursor lists top-voted open posts via MCP
- Reads the device fields
- Ships
- Marks Done
- Voters get notified
Without step 5 the board trains people to leave Play reviews. Longer version: Close the feature request loop with MCP.
App Review / Play
A Settings row that sends text and votes is normal. Declare the data. Guest voter id is a random install id, not advertising id.
A WebView of a third-party board is usually allowed. Users failing the login wall is the actual loss.
FAQ
Does WishKit support Flutter?
No.
Do I need a backend?
No. The package talks to FeedbackJar. You moderate in the dashboard.
Can I keep Canny on the website?
Yes. Two lists until you import.
Min SDK?
Flutter 3.10 / Dart 3. The package does not drag a WebView plugin.
Bottom line
pubspec.yaml either gets feedbackjar (or UserOrient) or you are shipping a website inside the app.
Start a 7-day trial. Same widget ID on Flutter, iOS, and Android.