I've spent the past several days trying to implement a basic deep link mechanism in my FlutterFlow project—just to allow users to open a specific page in the app via a QR code. What should be a simple and common use case has become a time-consuming and disappointing experience due to FlutterFlow’s limited and fragmented support for native deep linking.
Despite having access to main.dart
, it's currently not possible to use standard deep link packages like uni_links
or app_links
effectively. Many of the necessary methods (e.g., getInitialUri()
, getInitialAppLink()
, allUriLinkStream
, getLatestLink()
, etc.) are either completely unsupported or throw compile-time errors in FlutterFlow's environment. Even though app_links
version 6.3.2 is included by default, the most essential methods for capturing initial link data simply don’t exist or cannot be accessed in custom actions.
I attempted to set up a clean custom action using AppLinks().getInitialUri()
—which is the documented way to retrieve deep links when the app is opened via an external URI—but the method is undefined. Switching to getInitialAppLink()
also fails. Even methods like uriLinkStream.first
are not usable in practice. I also tried to capture and process the intent using the onPageLoad
or final actions
on main.dart
, but nothing worked consistently when the app was cold-started via a link (e.g., after QR scan). The only path that reliably works is via Branch.io integration, which is a third-party commercial service.
That leads to the real concern: FlutterFlow almost feels like it is forcing developers to adopt Branch.io by making all other routes either broken or undocumented. This is particularly frustrating for developers trying to avoid adding unnecessary external SDKs or paying for features that should be natively supported.
Deep linking is not a luxury—it’s a basic necessity for any serious app. FlutterFlow should either officially support a first-party solution (like uni_links
or app_links
) with full compatibility or provide clearer documentation on how to achieve basic deep linking functionality without Branch.io.
Until then, developers are left either reverse-engineering workarounds or giving in to third-party lock-ins.