FlutterFlow does not have any built-in AR or VR widgets. If you searched for an AR drag-and-drop widget in the FlutterFlow widget palette, it does not exist. The real paths are: a Custom Widget using the ar_flutter_plugin package for AR placement, flutter_3d_controller for 3D model viewing, or a WebView widget loading a WebAR experience. All three require Flutter package dependencies added in the Custom Code panel.
The Reality of AR/VR in FlutterFlow (No Shortcuts Here)
One of the most common misconceptions about FlutterFlow is that its visual widget palette includes AR or VR components. It does not. FlutterFlow focuses on standard mobile and web app patterns — forms, lists, maps, media — and does not bundle AR/VR capabilities out of the box. That said, FlutterFlow's Custom Widget system gives you access to the full Flutter package ecosystem, which includes excellent AR and 3D packages. There are three realistic paths for AR/VR features in a FlutterFlow app: a 3D model viewer (flutter_3d_controller) for product visualization, AR placement (ar_flutter_plugin) for placing objects in the real world, and WebAR (A-Frame or 8th Wall loaded in a WebView) for browser-based AR. This guide clarifies what each path involves so you can choose the right approach.
Prerequisites
- FlutterFlow Pro plan (Custom Widgets and code export are required for iOS/Android AR configuration)
- Basic understanding of FlutterFlow Custom Code panel and Custom Widgets
- 3D model files in GLTF/GLB format (for flutter_3d_controller) hosted on Firebase Storage
- Apple ARKit-compatible device (iPhone 6s or later) for iOS AR testing
- Android ARCore-compatible device for Android AR testing
Step-by-step guide
Confirm FlutterFlow has no built-in AR widget
Confirm FlutterFlow has no built-in AR widget
Open your FlutterFlow project and click the '+' icon in the widget panel to add a new widget. Search for 'AR', 'augmented', 'virtual reality', '3D', or 'model viewer' in the widget search bar. You will find no results matching these terms. This is expected and not a bug — FlutterFlow's built-in widget library covers standard UI patterns. The only way to add AR/VR to a FlutterFlow app is through (a) a Custom Widget that wraps a Flutter AR package, (b) a WebView widget loading a web-based AR experience, or (c) a Custom Action that launches a separate native AR session. Choose your path based on your requirements before proceeding.
Expected result: You have confirmed FlutterFlow has no built-in AR widget and have chosen one of the three implementation paths.
Path A — Add a 3D model viewer with flutter_3d_controller
Path A — Add a 3D model viewer with flutter_3d_controller
Add flutter_3d_controller to your project's pubspec.yaml via the Custom Code panel's pubspec tab: 'flutter_3d_controller: ^2.0.0'. Tap Get Packages. Create a new Custom Widget named 'ModelViewer3D'. Define two required parameters: modelUrl (String — the GLTF/GLB URL from Firebase Storage) and width/height (double). In the widget code, return a Flutter3DViewer widget from the flutter_3d_controller package, passing the src parameter as a NetworkGlbLoader with your modelUrl. The flutter_3d_controller widget handles gestures for rotation, zoom, and pan automatically. This is the fastest implementation — no iOS/Android native setup required, works in both Test Mode and Run Mode.
1import 'package:flutter/material.dart';2import 'package:flutter_3d_controller/flutter_3d_controller.dart';34class ModelViewer3D extends StatefulWidget {5 const ModelViewer3D({6 super.key,7 required this.modelUrl,8 required this.width,9 required this.height,10 });11 final String modelUrl;12 final double width;13 final double height;1415 @override16 State<ModelViewer3D> createState() => _ModelViewer3DState();17}1819class _ModelViewer3DState extends State<ModelViewer3D> {20 final Flutter3DController controller = Flutter3DController();2122 @override23 Widget build(BuildContext context) {24 return SizedBox(25 width: widget.width,26 height: widget.height,27 child: Flutter3DViewer(28 controller: controller,29 src: widget.modelUrl,30 enableTouch: true,31 ),32 );33 }34}Expected result: The ModelViewer3D Custom Widget compiles and displays a rotating 3D model when given a valid GLB URL.
Path B — Add AR placement with ar_flutter_plugin
Path B — Add AR placement with ar_flutter_plugin
AR placement — placing virtual objects on real-world surfaces using the device camera — requires native platform setup. Add 'ar_flutter_plugin: ^0.7.3' to pubspec.yaml and tap Get Packages. For iOS: export your FlutterFlow project code (Pro plan), open in Xcode, add the 'Privacy - Camera Usage Description' key to Info.plist, and add the ARKit capability to your app target. For Android: add the CAMERA permission and AR_REQUIRED meta-data to AndroidManifest.xml, and add the 'com.google.ar:core' dependency to build.gradle. Create a Custom Widget named 'ARPlacementView' that returns an ARView widget from ar_flutter_plugin. Wire AR hit testing and model placement logic in the widget's AR session handlers.
Expected result: The ARPlacementView Custom Widget shows the device camera feed with AR tracking planes visible, and tapping a surface places the 3D model.
Path C — Embed WebAR using FlutterFlow's WebView widget
Path C — Embed WebAR using FlutterFlow's WebView widget
WebAR uses JavaScript libraries (A-Frame + AR.js, 8th Wall, or Niantic Lightship) to deliver AR experiences through a web browser loaded in a WebView. This path requires no custom Flutter packages, no platform-specific native setup, and works on any device with a camera. In FlutterFlow, add a WebView widget (built-in — search 'WebView' in the widget panel) to your page. Set its URL to your hosted WebAR page. You can host the WebAR page on Firebase Hosting, Vercel, or any static host. Pass the 3D model URL to the WebAR page as a URL parameter so you can dynamically change which model is shown.
Expected result: The WebView widget loads your WebAR page and the device camera activates with AR capabilities accessible from within the FlutterFlow app.
Handle camera permissions for AR features
Handle camera permissions for AR features
All three AR paths require camera access. In FlutterFlow, go to Settings → App Details → Permissions and enable 'Camera'. This adds the iOS NSCameraUsageDescription key to Info.plist and the CAMERA permission to the Android manifest. Write a clear usage description: 'We use your camera to display augmented reality content.' For the ar_flutter_plugin path, also request the camera permission explicitly at runtime before launching the AR view — use the permission_handler Flutter package in a Custom Action that calls Permission.camera.request() and checks the PermissionStatus result. Show a custom explanation dialog before requesting if the status is 'denied'.
Expected result: Camera permission is declared in app settings and requested at runtime before the AR view is shown. The AR experience launches successfully on a physical device after permission is granted.
Test AR features on physical devices
Test AR features on physical devices
AR features require physical hardware and cannot be tested in the FlutterFlow canvas, Test Mode browser, iOS Simulator, or Android emulators. Use FlutterFlow's Run Mode to deploy to a connected physical device. For Path A (flutter_3d_controller), Run Mode on a recent iPhone or Android phone is sufficient. For Path B (ar_flutter_plugin), you need an ARKit-compatible iPhone (6s or later, running iOS 13+) or an ARCore-compatible Android device. Verify the AR tracking planes are detected (shown as colored grids on real surfaces), and test model placement by tapping detected planes. Check the DevTools console for any ARKit/ARCore initialization errors.
Expected result: The AR feature works on a physical device with correct plane detection, model placement, and no permission errors in the DevTools console.
Complete working example
1// ─── Custom Widget: ModelViewer3D ─────────────────────────────────────────────2// Displays an interactive 3D model from a GLB/GLTF URL.3// Required parameters: modelUrl (String), width (double), height (double)4// pubspec.yaml: flutter_3d_controller: ^2.0.05//6// Usage in FlutterFlow:7// 1. Add this as a Custom Widget named 'ModelViewer3D'8// 2. Set parameters: modelUrl (String), width (double), height (double)9// 3. Place on any page, bind modelUrl to a Firestore document field1011import 'package:flutter/material.dart';12import 'package:flutter_3d_controller/flutter_3d_controller.dart';1314class ModelViewer3D extends StatefulWidget {15 const ModelViewer3D({16 super.key,17 required this.modelUrl,18 required this.width,19 required this.height,20 this.autoPlay = true,21 });2223 final String modelUrl;24 final double width;25 final double height;26 final bool autoPlay;2728 @override29 State<ModelViewer3D> createState() => _ModelViewer3DState();30}3132class _ModelViewer3DState extends State<ModelViewer3D> {33 final Flutter3DController _controller = Flutter3DController();3435 @override36 void dispose() {37 _controller.dispose();38 super.dispose();39 }4041 @override42 Widget build(BuildContext context) {43 if (widget.modelUrl.isEmpty) {44 return SizedBox(45 width: widget.width,46 height: widget.height,47 child: const Center(48 child: Text('No model URL provided'),49 ),50 );51 }52 return SizedBox(53 width: widget.width,54 height: widget.height,55 child: Flutter3DViewer(56 controller: _controller,57 src: widget.modelUrl,58 enableTouch: true,59 onLoad: () => debugPrint('ModelViewer3D: model loaded'),60 onError: () => debugPrint('ModelViewer3D: error loading model'),61 ),62 );63 }64}6566// ─── pubspec.yaml additions ───────────────────────────────────────────────────67// dependencies:68// flutter_3d_controller: ^2.0.069//70// Note: For AR features, add ar_flutter_plugin: ^0.7.3 instead.71// AR requires native iOS/Android configuration via code export (Pro plan).Common mistakes
Why it's a problem: Expecting a drag-and-drop AR widget in FlutterFlow's widget palette
How to avoid: Use one of the three paths described in this tutorial: flutter_3d_controller Custom Widget for 3D model viewing, ar_flutter_plugin Custom Widget for AR placement, or WebView with a WebAR URL for browser-based AR.
Why it's a problem: Testing AR features in FlutterFlow's canvas preview or iOS Simulator
How to avoid: Always test AR features on a physical device using Run Mode. Connect the device via USB and select it as the target before clicking Run.
Why it's a problem: Hosting 3D model files in Firestore as base64-encoded strings instead of Firebase Storage URLs
How to avoid: Upload 3D model files to Firebase Storage and store only the download URL string in Firestore. Use Firebase Storage's built-in CDN caching for fast model loading.
Why it's a problem: Using ar_flutter_plugin without completing the required iOS/Android native configuration
How to avoid: Export your FlutterFlow project code (Pro plan) and complete the platform-specific configuration in Xcode and Android Studio before testing on device. Follow the ar_flutter_plugin README on pub.dev exactly.
Best practices
- Choose the simplest AR path that meets your requirements — WebAR via WebView has the lowest setup complexity and broadest device compatibility.
- Always test AR features on the minimum-spec target device (oldest supported iPhone/Android), since AR performance degrades significantly on older hardware.
- Provide a fallback UI for devices that do not support AR — check for ARKit/ARCore availability before launching the AR view and show a static 3D model viewer or images as fallback.
- Keep 3D model file sizes under 5MB for production apps — large models cause slow loading and poor performance on mid-range devices. Use Draco compression for GLTF files.
- Request camera permission at a contextually relevant moment (when the user taps 'View in AR') rather than on app launch, to maximize permission grant rate.
- For WebAR experiences, preload the AR page in the background before the user navigates to it — this reduces the perceived loading time from 3-5 seconds to near-instant.
- Show an onboarding overlay when the AR view first opens that explains the gestures (rotate, zoom, place) — AR UX is unfamiliar to many users.
- Use flutter_3d_controller for product visualization use cases and save ar_flutter_plugin for scenarios where placing objects on real surfaces adds genuine value, not just as a novelty.
Still stuck?
Copy one of these prompts to get a personalized, step-by-step explanation.
I'm building a FlutterFlow app and want to add a 3D product viewer feature. I don't need full AR placement — just the ability to view a 3D model (GLB file from Firebase Storage) that the user can rotate and zoom with touch gestures. Please write a FlutterFlow Custom Widget in Dart using the flutter_3d_controller package. The widget should accept parameters: modelUrl (String), width (double), height (double). Include dispose() and a fallback UI for empty URLs.
Write a FlutterFlow Custom Widget called 'ModelViewer3D' using flutter_3d_controller ^2.0.0. Parameters: modelUrl (String, required), width (double, required), height (double, required). The widget should show a Flutter3DViewer with touch enabled, log load/error events with debugPrint, dispose the controller properly, and show a centered text fallback if modelUrl is empty. Format as a complete StatefulWidget class ready to paste into the FlutterFlow Custom Code editor.
Frequently asked questions
Does FlutterFlow have any built-in AR or VR widgets?
No. FlutterFlow's widget palette does not include any AR, VR, or 3D model viewer widgets. To add AR/VR features, you must use a Custom Widget that wraps a Flutter AR package (ar_flutter_plugin for AR, flutter_3d_controller for 3D model viewing), or use FlutterFlow's built-in WebView widget to load a WebAR experience hosted externally.
Which path is easiest: Custom Widget or WebView WebAR?
WebView loading a WebAR URL is the easiest path — no Flutter packages to add, no platform configuration, just a WebView widget with a URL. The tradeoff is that WebAR quality and performance are lower than native ARKit/ARCore experiences. For production product visualization, the flutter_3d_controller Custom Widget path gives better quality with moderate setup effort.
Can I use Unity for the AR scenes and embed them in FlutterFlow?
Yes, with significant complexity. The flutter_unity_widget package allows embedding a Unity scene inside a Flutter widget, which you can wrap in a FlutterFlow Custom Widget. However, Unity integration requires exporting your FlutterFlow project code, modifying native iOS/Android build files, and managing the Unity build separately. This is suitable for games or high-fidelity AR but overkill for simple product visualization.
Will AR features work on all devices?
No. ARKit requires iPhone 6s or later (iOS 13+). ARCore requires a compatible Android device — Google maintains a list at developers.google.com/ar/devices. Devices that do not support AR will crash if you try to initialize an AR session without checking compatibility first. Always check ARCore/ARKit availability before launching the AR view and provide a fallback.
Do I need FlutterFlow Pro to add AR features?
Yes, effectively. While you can write Custom Widgets on any plan, AR features require native iOS/Android platform configuration (Info.plist entries, Podfile changes, AndroidManifest entries) that can only be done after exporting the project code, which requires Pro plan. The exception is WebAR via the built-in WebView widget, which works on any plan.
What 3D model file format should I use?
GLB (binary GLTF 2.0) is the recommended format for Flutter AR packages. It is a single self-contained binary file that includes textures and materials. GLTF (the text-based variant) also works but requires separate texture files. Apply Draco compression to reduce file sizes by 60-80%. Avoid OBJ and FBX formats — most Flutter AR packages do not support them natively.
Talk to an Expert
Our team has built 600+ apps. Get personalized help with your project.
Book a free consultation