Connect FlutterFlow to IntelliJ IDEA by exporting your FlutterFlow project code (Pro plan required) via Download Code or GitHub push, then opening the exported Flutter project in IntelliJ with the official Flutter and Dart plugins installed. IntelliJ's built-in Android emulator, Gradle sync handling, and refactoring tools make it the strongest local IDE for debugging platform-specific custom actions in FlutterFlow exports.
| Fact | Value |
|---|---|
| Tool | IntelliJ IDEA |
| Category | DevOps & Tools |
| Method | Custom Action (Dart) |
| Difficulty | Intermediate |
| Time required | 30 minutes |
| Last updated | July 2026 |
Developing Your FlutterFlow App Locally in IntelliJ IDEA
FlutterFlow generates a real Flutter project. Every screen, widget, and navigation route it builds compiles to standard Dart code with a `pubspec.yaml`, `lib/` folder, `android/`, `ios/`, and `web/` targets. That code is a first-class Flutter project that any Flutter-capable IDE can open and run — IntelliJ IDEA, Android Studio, or Visual Studio Code. The question is not whether IntelliJ can open a FlutterFlow export, but which IDE suits your workflow best.
IntelliJ IDEA (and its Android-specialized sibling, Android Studio) is the strongest local Flutter environment for Android-focused development. JetBrains' official Flutter and Dart plugins give IntelliJ a device selector in the toolbar, a Run panel for hot reload and hot restart, an integrated Android emulator manager, and a Dart analysis engine that flags type errors and unused imports in the generated code. IntelliJ also handles the Gradle sync for the Android build target more smoothly than lighter editors — when FlutterFlow's pinned Android Gradle plugin version conflicts with a newer local Android toolchain, IntelliJ's Gradle panel gives clearer error messages and resolution options than a bare terminal.
One reality to internalize before starting: IntelliJ is for running, debugging, and reading the generated code — not for editing it and expecting those edits to survive. The next time you push from FlutterFlow (whether via Download Code or GitHub), the entire `lib/` folder is regenerated and your IntelliJ hand-edits to generated files disappear. The safe exception is FlutterFlow's Custom Code files (Custom Actions, Custom Functions, Custom Widgets) — FlutterFlow does not overwrite those on re-export, so editing a custom action's Dart file in IntelliJ and then re-importing it into FlutterFlow via the Custom Code panel is a valid round-trip workflow.
Integration method
FlutterFlow exports a standard Flutter project (via Download Code ZIP or GitHub push on the Pro plan), which IntelliJ IDEA opens as a local Flutter project using the JetBrains Flutter and Dart plugins. You install the plugins, point them at your local Flutter SDK, open the exported project folder, let Gradle and pub sync resolve dependencies, then run and debug the app on an Android emulator or connected device. There is no real-time link between IntelliJ and FlutterFlow — each FlutterFlow export produces a new code snapshot you open in IntelliJ.
Prerequisites
- A FlutterFlow account on the Pro plan ($70/mo) — code export (Download Code or GitHub push) requires Pro; Free and Standard plans do not include it
- IntelliJ IDEA installed on your Mac or Windows machine — the Community edition (free) supports Flutter development once the plugins are installed; Ultimate is not required
- The Flutter SDK installed locally on your machine from flutter.dev — IntelliJ's plugins wrap the local SDK, they do not bundle one
- Android Studio or the Android SDK command-line tools installed separately if you want to run Android emulators (IntelliJ can manage AVDs but still needs the Android SDK)
- Git installed locally if you plan to clone from the FlutterFlow GitHub export rather than using the ZIP download
Step-by-step guide
Upgrade to Pro and export the FlutterFlow project
IntelliJ IDEA only enters the picture once you have the Flutter source code on your local machine — and that code comes from FlutterFlow's code export, which requires the Pro plan ($70/mo). If you're on Free or Standard, open your FlutterFlow account settings and upgrade first. Once on Pro, you have two export paths. The first is Download Code: in your FlutterFlow project, look for the Download Code button in the top toolbar (the exact icon varies by FlutterFlow version, but it's usually near the Publish/Deploy controls). Click it and FlutterFlow downloads a ZIP file of the entire Flutter project. Unzip it to a folder on your machine — somewhere stable like ~/Projects/my-app-flutter. The second path is the GitHub integration: if you've connected FlutterFlow to GitHub (Settings → Integrations → GitHub) and pushed at least once, you can clone the GitHub repo to your machine using git clone with the repo URL. The GitHub path is better for ongoing development because you can pull new FlutterFlow exports without downloading and unzipping each time. For a first-time setup, either path works — use the ZIP if you haven't set up GitHub yet. After export or clone, confirm you can see the standard Flutter project structure in the folder: pubspec.yaml at the root, lib/ containing main.dart and screen files, android/, ios/, and web/ directories.
Pro tip: Create a dedicated folder for FlutterFlow exports rather than unzipping each one onto the Desktop. If you use the GitHub path, a single cloned repo receives each new export as a commit — no manual file management needed.
Expected result: A folder on your machine contains the Flutter project with pubspec.yaml, lib/, android/, ios/, and web/ — this is the FlutterFlow-generated code ready to open in IntelliJ.
Install the Flutter and Dart plugins in IntelliJ IDEA
Open IntelliJ IDEA. Before opening the project, you need the JetBrains Flutter and Dart plugins installed. Go to IntelliJ IDEA menu → Settings (or Preferences on macOS) → Plugins. In the Plugins dialog, click the Marketplace tab and search for 'Flutter'. You'll find the Flutter plugin published by JetBrains — click Install. IntelliJ will tell you that Flutter requires the Dart plugin and offer to install both together — accept. After installation, click 'Restart IDE' to activate the plugins. When IntelliJ restarts, the status bar at the bottom will now include a device selector (shows 'No devices' until you configure a device or emulator). You may also see a notification asking you to set the Flutter SDK path — click it, or navigate to Settings → Languages & Frameworks → Flutter and set the 'Flutter SDK path' to the directory where you installed the Flutter SDK (e.g. /Users/yourname/flutter or C:\flutter). IntelliJ uses this path to find the flutter executable, the Dart SDK bundled inside it, and the flutter pub command for resolving dependencies. If you installed Flutter from flutter.dev and added it to your PATH, IntelliJ can often detect it automatically — look for a green checkmark next to the path field confirming detection.
Pro tip: If IntelliJ shows 'Dart SDK is not configured' even after installing the Flutter plugin, the root cause is almost always a missing Flutter SDK path. The Dart plugin uses the Dart SDK that ships inside the Flutter SDK — set the Flutter path first and the Dart error resolves automatically.
Expected result: IntelliJ IDEA shows the Flutter and Dart plugins as installed and enabled. The Flutter SDK path is set and shows a green validation checkmark. The status bar device selector is visible.
Open the exported Flutter project and resolve dependencies
In IntelliJ IDEA, go to File → Open and navigate to the root of your exported Flutter project folder — the one containing pubspec.yaml. Select that folder (not a file inside it) and click OK. IntelliJ will detect it as a Flutter project and offer to run pub get — click 'Get dependencies' when prompted, or if not prompted, open the Terminal panel at the bottom of IntelliJ and run the pub get command manually. This step downloads all the pub.dev packages that FlutterFlow's generated code depends on — things like supabase_flutter, firebase_core, go_router, and any custom action dependencies you've added. Pub get may take 1–3 minutes on a fresh install. While it runs, IntelliJ's Dart analysis engine starts indexing the project — you'll see 'Indexing...' in the status bar. Wait for indexing to complete before running the app. If you see red error underlines in main.dart immediately after opening, they usually resolve once pub get and indexing finish. After pub get succeeds, check the Gradle side for the Android target: in the right side panel, look for the Gradle tool window (or go to View → Tool Windows → Gradle). If Gradle shows a sync needed, click 'Sync Now'. Gradle downloads the Android build dependencies — this can take several minutes the first time. A successful Gradle sync shows a green checkmark in the Build output.
Pro tip: If pub get fails with 'version solving failed' errors, FlutterFlow's pinned package versions may be incompatible with your local Flutter SDK version. The fastest fix is to download and use the same Flutter SDK version that FlutterFlow uses — check FlutterFlow's release notes for the currently targeted Flutter stable channel version.
Expected result: Pub get completes without errors, the Dart analysis engine shows no package-not-found errors, and the Gradle sync (for Android) succeeds. The project is ready to run.
Configure an Android emulator and run the app with hot reload
With the project open and dependencies resolved, you're ready to run the app on a local emulator or connected device. For an Android emulator, open the Device Manager in IntelliJ (View → Tool Windows → Device Manager, or the phone icon in the right toolbar). Click 'Create Virtual Device', choose a phone model (Pixel 6 is a good default), select a system image (download one if not available — choose a recent Android API level, e.g. API 34), and click Finish. The AVD (Android Virtual Device) appears in the device list — click the green play triangle to start the emulator. Once the emulator boots and shows the Android home screen, select it in IntelliJ's device dropdown in the top toolbar. Now click the green Run button (or press Shift+F10 on Windows/Linux, Control+R on macOS) to build and launch the FlutterFlow app on the emulator. The first build compiles the Dart code to native Android — this takes 1–3 minutes. Subsequent runs use hot reload (press 'r' in the Run console, or click the lightning bolt icon) which injects code changes in under a second without losing app state. For iOS simulation on macOS, you need Xcode installed — open the Device Manager and choose an iOS Simulator instead. Use hot reload extensively while debugging custom actions: edit the Dart file in IntelliJ, save, and the emulator updates almost instantly.
Pro tip: Custom Actions defined in FlutterFlow's Custom Code panel land in lib/custom_code/actions/ in the exported project. These are the files you should focus IntelliJ debugging on — breakpoints in these files pause execution and let you inspect variables, API responses, and platform channel calls.
Expected result: The FlutterFlow app runs on the Android emulator in IntelliJ with the full app UI visible. Hot reload is functional — saving a Dart file updates the running emulator within seconds.
Debug custom actions and platform-specific issues using IntelliJ's tools
The primary reason to use IntelliJ over FlutterFlow's browser-based editor is debugging capability. FlutterFlow's Local Run preview is useful for basic UI testing, but it cannot hit breakpoints in Dart code, inspect variable values at runtime, or surface platform channel errors clearly. IntelliJ can do all of these. To set a breakpoint, open a file in lib/custom_code/actions/ (your custom Dart files), click in the gutter to the left of a line number — a red dot appears. Run the app in Debug mode (Shift+F9 on Windows/Linux, Control+D on macOS, or use the bug icon instead of the play button). When the app hits the breakpoint, execution pauses and you can inspect the call stack, hover over variables to see their runtime values, and step through code line by line using F8 (step over) and F7 (step into). Common issues to debug this way: incorrect API response parsing in a custom action that calls a third-party API, null reference exceptions when a widget binds to a data field that hasn't loaded yet, and MissingPluginException errors that mean a pub.dev package's native platform code wasn't linked correctly in the Android build. For Gradle-level Android build errors — like version conflicts between FlutterFlow's generated Gradle config and your local Android Gradle Plugin — open the Gradle tool window, expand the Tasks tree, and look at the build output. IntelliJ shows the full Gradle error stack with clickable file links, which is far more actionable than a generic terminal error.
1// Example: custom action in lib/custom_code/actions/send_push_notification.dart2// Breakpoint here to inspect the payload before the API call3import 'dart:convert';4import 'package:http/http.dart' as http;56Future<bool> sendPushNotification({7 required String deviceToken,8 required String title,9 required String body,10}) async {11 // Set a breakpoint on the line below to inspect deviceToken at runtime12 final payload = json.encode({13 'to': deviceToken,14 'notification': {'title': title, 'body': body},15 });1617 // Note: this calls a server proxy — never put FCM server key here.18 // The actual key lives in your Firebase Cloud Function.19 final response = await http.post(20 Uri.parse('https://your-project.cloudfunctions.net/sendNotification'),21 headers: {'Content-Type': 'application/json'},22 body: payload,23 );2425 return response.statusCode == 200;26}Pro tip: Android Studio is essentially IntelliJ IDEA with Android-specific features pre-bundled and is the tool FlutterFlow's own documentation recommends for local development. If you're choosing between the two for Flutter work, Android Studio is slightly simpler to set up for Android emulators since the Android SDK tools are bundled — IntelliJ requires setting them up separately.
Expected result: You can set breakpoints in custom action Dart files, run the app in Debug mode, and inspect variable values when breakpoints are hit — giving you full debuggability of FlutterFlow's custom code on the emulator.
Establish a safe sync strategy between IntelliJ edits and FlutterFlow
The final and most important step is deciding how changes flow between your IntelliJ session and FlutterFlow. There are two valid strategies. Strategy A — FlutterFlow as source of truth (recommended for most founders): all screen and logic work happens in FlutterFlow's browser editor. IntelliJ is read-only for generated files — you open it to debug, run, and review, but you never save changes to `lib/pages/` or `lib/app_state.dart`. When you need to add custom Dart logic, you write it in FlutterFlow's Custom Code panel (left nav → Custom Code), test it with FlutterFlow's Local Run, then export a new ZIP or push to GitHub to get the updated code in IntelliJ. Strategy B — Frozen fork (for developers who have outgrown FlutterFlow's editor): you export once from FlutterFlow, then treat the exported project as the new source of truth. You never push from FlutterFlow again — all future development happens directly in IntelliJ on the exported Dart code. This is a one-way door: you lose the visual FlutterFlow editor but gain full Dart codebase control. Most non-technical founders should stay with Strategy A. One universal rule for both strategies: never hardcode API keys, Firebase credentials, or any secret in Dart files, even temporarily for local testing. The same Dart file that runs in IntelliJ ships to users — use App State variables that read from a backend call, or route secret operations through a Firebase Cloud Function. A key in a Dart file is a key in the compiled binary that anyone can extract.
Pro tip: If you want the best of both worlds — FlutterFlow's visual editor for screens and IntelliJ for custom code debugging — the cleanest workflow is: build screens in FlutterFlow → write custom actions in FlutterFlow's Custom Code panel → export → open in IntelliJ only for debugging → fix bugs → update the custom action in FlutterFlow's Custom Code panel → export again. This keeps FlutterFlow as the authoritative project database while giving you IntelliJ's debugger when you need it.
Expected result: Your team has a documented workflow specifying which changes happen in FlutterFlow's editor vs. IntelliJ, with the understanding that FlutterFlow exports overwrite all generated files and only Custom Code panel files survive re-export.
Common use cases
Debugging a FlutterFlow custom action that fails on Android
A founder built a custom Dart action in FlutterFlow that calls a platform API (local notifications, camera permission). It works in FlutterFlow's Local Run preview but crashes with a MissingPluginException on an Android device. They export to IntelliJ, set a breakpoint in the custom action file, run on the Android emulator, and pinpoint the exact pub.dev package call that fails — something FlutterFlow's browser-based editor cannot do.
Export the FlutterFlow project to IntelliJ, open the custom notification action file in lib/custom_code/actions/, add a breakpoint at the platform channel call, and run on the Android emulator to catch the MissingPluginException.
Copy this prompt to try it in FlutterFlow
Developer review of a FlutterFlow export before handing off to a client
A FlutterFlow developer exports the generated code to IntelliJ, runs the Dart analyzer to review code quality, checks for unused imports and type warnings in generated files, and verifies that custom actions compile cleanly — providing a more thorough technical review than the FlutterFlow browser editor allows before the client receives the project.
Open the FlutterFlow export in IntelliJ IDEA, run flutter analyze to surface any type errors or deprecated API calls in the generated code, and check the custom actions for null-safety issues.
Copy this prompt to try it in FlutterFlow
Platform-specific Gradle debugging for an Android release build
A FlutterFlow app builds and runs fine in debug mode but fails during a release build for the Play Store. The developer exports to IntelliJ, opens the Gradle panel, runs the release build task, and uses IntelliJ's error tree to trace a dependency conflict between FlutterFlow's pinned Gradle plugin version and the target Android SDK level.
Export the FlutterFlow project, open it in IntelliJ IDEA, run the Gradle assembleRelease task, and identify why the build fails with a minSdkVersion conflict between the Flutter Firebase plugin and the FlutterFlow-generated android/build.gradle.
Copy this prompt to try it in FlutterFlow
Troubleshooting
'Dart SDK is not configured' error when opening the project in IntelliJ
Cause: IntelliJ's Dart plugin could not find the Dart SDK. This happens because the Dart SDK is bundled inside the Flutter SDK, not installed separately — IntelliJ needs the Flutter SDK path to locate Dart.
Solution: Go to Settings (Preferences on macOS) → Languages & Frameworks → Flutter. Set the 'Flutter SDK path' field to the root folder of your Flutter installation (e.g. /Users/yourname/flutter or C:\flutter\flutter). Click Validate to confirm IntelliJ finds the SDK. The Dart SDK error will clear automatically once the Flutter path is set correctly, because IntelliJ reads Dart from inside the Flutter SDK directory.
Gradle sync fails with version conflict errors after opening the FlutterFlow export
Cause: FlutterFlow pins specific versions of the Android Gradle Plugin and Kotlin in the generated android/build.gradle. If your local Android SDK or Gradle installation is significantly newer than FlutterFlow's pinned versions, Gradle sync fails with version incompatibility errors.
Solution: Open android/build.gradle in the project and check the classpath version for com.android.tools.build:gradle. Cross-reference it with the version compatible with your installed Android Gradle Plugin. In IntelliJ's Gradle panel, click the error link to jump to the problematic line. Often the fix is to update android/build.gradle to a slightly newer Gradle plugin version that's compatible with both FlutterFlow's pubspec and your local toolchain. Note: editing android/build.gradle is a generated-file edit that FlutterFlow will overwrite on the next export — if this becomes a recurring issue, use Flutter's version pinning in pubspec.yaml for upstream packages.
1// android/build.gradle — update if Gradle sync fails due to version mismatch2buildscript {3 ext.kotlin_version = '1.9.0' // update to match your Kotlin toolchain4 repositories { google(); mavenCentral() }5 dependencies {6 classpath 'com.android.tools.build:gradle:8.1.0' // update to resolve conflict7 classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"8 }9}MissingPluginException on Android when a custom action calls a pub.dev package method
Cause: The pub.dev package uses a platform channel that requires native Android code registration. In FlutterFlow's browser-based preview, this native registration is absent. On a real device or emulator, the channel is available, but may not be registered if the package wasn't linked correctly in the generated Android project.
Solution: Run flutter pub get in the terminal (or click 'Get dependencies' in IntelliJ) to ensure all packages are resolved. Then run a clean rebuild: in IntelliJ's Terminal panel, run flutter clean followed by flutter pub get, then relaunch the app. If the error persists, check that the package lists the correct minSdkVersion — some packages require Android API 21+, and if FlutterFlow's generated android/app/build.gradle sets a lower minSdkVersion, the package's native code won't initialize.
Hand-edits made in IntelliJ disappeared after re-exporting from FlutterFlow
Cause: FlutterFlow regenerates all files in lib/ (except Custom Code files) on every export. Edits made in IntelliJ to generated screen files, app_state.dart, or routing files are overwritten by the next FlutterFlow push or Download Code.
Solution: Move any persistent custom logic into FlutterFlow's Custom Code panel (left nav → Custom Code → + Add → Action or Function). Custom action and function files located in lib/custom_code/ survive re-exports. For one-time local fixes that you don't plan to round-trip through FlutterFlow, document what you changed so you can reapply them after the next export if needed.
Best practices
- Use Android Studio as an equivalent alternative to IntelliJ IDEA — it's an IntelliJ variant with Android tools pre-bundled and is what FlutterFlow's own documentation recommends for local Flutter development.
- Set the Flutter SDK path in IntelliJ before opening any Flutter project — most 'Dart not configured' errors trace to a missing SDK path.
- Run flutter clean && flutter pub get after each fresh export from FlutterFlow before running in IntelliJ — stale build artifacts from a previous export version cause confusing runtime errors.
- Use IntelliJ's Debug mode (not Run mode) when investigating custom action failures — breakpoints in lib/custom_code/ give you variable inspection and stack traces that FlutterFlow's preview cannot provide.
- Never hardcode secrets (API keys, Firebase credentials) in Dart files for local testing — the same code ships to users in the compiled binary; route secrets through Firebase Cloud Functions or Supabase Edge Functions.
- Treat FlutterFlow as the source of truth for generated screens — limit IntelliJ edits to Custom Code files (lib/custom_code/) which survive re-export, and avoid editing generated lib/pages/ files you expect to keep.
- Keep your local Flutter SDK on the stable channel and check FlutterFlow's current target Flutter version — running a significantly newer Flutter SDK than FlutterFlow targets increases the chance of pub version conflicts.
- When debugging Gradle errors, use IntelliJ's Gradle tool window instead of the terminal — the error tree has clickable file links and shows the full dependency chain, making version conflicts much faster to diagnose.
Alternatives
Choose Visual Studio Code if you want a lighter-weight editor focused on fast setup and hot reload — VS Code's Dart-Code extensions provide the same core debugging capability as IntelliJ with a simpler UI, though IntelliJ's Android emulator management and Gradle tooling are more integrated.
Choose GitHub as a complement rather than an alternative — push your FlutterFlow export to GitHub first, then clone into IntelliJ, making it easy to pull each new FlutterFlow export without re-downloading ZIPs.
Choose Docker if your goal is containerizing the Flutter web build for deployment or running flutter build web in a reproducible CI environment — Docker handles the build pipeline while IntelliJ handles local interactive debugging.
Frequently asked questions
Do I need IntelliJ IDEA Ultimate or does the Community edition work for Flutter?
The free Community edition of IntelliJ IDEA fully supports Flutter development once the Flutter and Dart plugins are installed. The Ultimate edition adds web framework support (Spring, React, etc.) and database tools, none of which are needed for Flutter development. Save the money and use Community unless you're doing full-stack Java/Kotlin server development in the same IDE.
What is the difference between IntelliJ IDEA and Android Studio for FlutterFlow projects?
Android Studio is a variant of IntelliJ IDEA that bundles the Android SDK, Android emulator, and Android-specific tooling out of the box. For FlutterFlow projects targeting Android, Android Studio is slightly easier to set up because you don't need to install the Android SDK separately — it comes pre-configured. IntelliJ IDEA requires the Android SDK to be installed separately for Android targets. Both IDEs run the same JetBrains Flutter plugin. FlutterFlow's own documentation typically recommends Android Studio, so that is the lower-friction starting point.
Can I make changes in IntelliJ and import them back into FlutterFlow?
Not directly. FlutterFlow does not import external Dart code — there is no 'import from IntelliJ' or 'sync from repo' feature. The only round-trip path is for Custom Actions: you can write or edit a custom action in IntelliJ (in lib/custom_code/actions/), copy the Dart code, and paste it back into FlutterFlow's Custom Code panel manually. For everything else, FlutterFlow is the authority and IntelliJ is read-only.
Does IntelliJ work for debugging FlutterFlow custom actions that use platform APIs?
Yes — this is one of the strongest reasons to use IntelliJ with FlutterFlow. Custom actions that call platform APIs (camera, HealthKit, push notifications, local storage) cannot be debugged in FlutterFlow's browser-based editor. When you run the exported project in IntelliJ's Debug mode on an Android emulator or connected device, you can set breakpoints in lib/custom_code/actions/ and inspect the exact values going into platform channel calls, catching MissingPluginException and permission errors at the source.
What happens to my IntelliJ debugging session when I re-export from FlutterFlow?
A new FlutterFlow export overwrites the files in your project folder (if you're using the ZIP download path) or creates a new commit in the GitHub repo (if you're using the GitHub path and git pull). Either way, you need to reopen the project in IntelliJ after each export and run pub get again before debugging. Breakpoints set in generated files (lib/pages/) may point to slightly different line numbers after a re-export if FlutterFlow added or removed lines in those screens. Breakpoints in Custom Code files (lib/custom_code/) are more stable since FlutterFlow preserves those files.
Should I use IntelliJ or just FlutterFlow's Local Run feature?
For most UI testing and basic flow verification, FlutterFlow's Local Run (which streams the app to a desktop companion) is fast and sufficient — no export needed. Use IntelliJ when you need something Local Run cannot do: setting breakpoints in custom Dart code, debugging Gradle or Android-specific build failures, running the app on a specific emulator API level, or performing a thorough code review of the generated Dart. If you're purely a visual builder who never touches custom Dart code, Local Run may be all you need and IntelliJ remains optional. If RapidDev is helping you build or debug custom actions for your FlutterFlow app, we handle the IntelliJ setup as part of the engagement — free scoping call at rapidevelopers.com/contact.
Talk to an Expert
Our team has built 600+ apps. Get personalized help with your project.
Book a free consultation