We gladly accept contributions via GitHub pull requests! If you are new to codiing IntelliJ plugins, here are a couple links to get started:
You must complete the Contributor License Agreement. You can do this online, and it only takes a minute. If you've never submitted code before, you must add your (or your organization's) name and contact info to the AUTHORS file.
- Install Flutter SDK from Flutter SDK download or github and set it up according to its instructions.
- Verify installation from the command line:
- Connect an android device with USB debugging.
cd path/to/flutter/examples/hello_world
flutter pub get
flutter doctor
flutter run
- Fork
https://github.com/flutter/flutter-intellij
into your own GitHub account. If you already have a fork, and are now installing a development environment on a new machine, make sure you've updated your fork so that you don't use stale configuration options from long ago. git clone [email protected]:<your_name_here>/flutter-intellij.git
cd flutter-intellij
git remote add origin [email protected]:flutter/flutter-intellij.git
(So that you fetch from the master repository, not your clone, when running git fetch et al.) The nameorigin
can be whatever you want
- Download and install the latest version of IntelliJ (2023.1 or later)
- IntelliJ Downloads
- Either the community edition (free) or Ultimate will work
- Determine the directory of your downloaded IntelliJ Community Edition installation
(e.g,
IntelliJ IDEA CE.app
,~/idea-IC-183.4886.37
or~/Library/Application Support/JetBrains/Toolbox/apps/IDEA-U/ch-0/211.6693.111/IntelliJ IDEA.app
)
- Set your JAVA_HOME directory.
-
On Mac, the following works: Check what version of java you have:
/usr/libexec/java_home -V
Set your JAVA_HOME env variable to match that version. In this example, my Java version was
11.0.14.1
export JAVA_HOME=`/usr/libexec/java_home -v 11.0.14.1`
-
- Set your FLUTTER_SDK directory to point to the Flutter SDK installed earlier.
export FLUTTER_SDK=/path/to/flutter
- This is only needed to run unit tests locally, and if not set, two tests will fail
- Ensure both FLUTTER_SDK and JAVA_HOME are added to the shell initialization script that runs at login (and not the one used for every interactive shell).
- Download other dependencies from the command line:
cd path/to/flutter-intellij
flutter pub get
(cd tool/plugin; flutter pub get)
bin/plugin test
- Start IntelliJ
- In the "Project Structure" dialog (
File | Project Structure
):- Select "Platform Settings > SDKs" click the "+" sign at the top "Add New SDK (Alt+Insert)" to configure the JDK
- Point it to the directory of the jbr which is under the IDEA's content (e.g.
IntelliJ IDEA CE.app/Contents/jbr
) - Change the name to
IntelliJ IDEA jbr 17
- Point it to the directory of the jbr which is under the IDEA's content (e.g.
- Select "Platform Settings > SDKs" click the "+" sign at the top "Add New SDK (Alt+Insert)" to configure an IntelliJ Platform Plugin SDK
- Point it to the directory of the content which is under the IDEA's installation
(e.g,
IntelliJ IDEA CE.app/Contents
) - Change the name to
IntelliJ IDEA Community Edition
- Change the "Internal Java Platform" to
IntelliJ IDEA jbr 17
- Point it to the directory of the content which is under the IDEA's installation
(e.g,
- Select "Platform Settings > SDKs" click the "+" sign at the top "Add New SDK (Alt+Insert)" to configure the JDK
- In the "Java Compiler" preference page, make sure that the "Project bytecode version" is set to
Same as language level
- In the "Kotlin Compiler" preference page, make sure that the "Target JVM Version" is set to
Same as language level
- One-time Dart plugin install - first-time a new IDE is installed and run you will need to install the Dart plugin
- Find
Plugins
(in Settings/Preferences) and install the Dart plugin, then restart the IDE, if needed
- Find
- Open the flutter-intellij project in IntelliJ (select and open the directory of the flutter-intellij repository).
- If you see a popup with "Gradle build scripts found", confirm loading the Gradle project and confirm that you trust it
- Ignore suggestion for protobuf-java plugin, unless you want it
- Open
File > Project Structure
- Select
Modules
- Select the
Paths
tab - For each module in the Modules list, select it and make sure it uses the inherited compile output path
- NOTE: Every time IntelliJ opens the project (or does a Gradle sync) it resets the output path, so you need to repeat this
- Select
- Build the project using
Build
|Build Project
- Try running the plugin; select the
flutter-intellij [runIde]
run config then click the Debug icon. This should open the "runtime workbench", a new instance of IntelliJ with the plugin installed. - If the Flutter Plugin doesn't load (Dart code or files are unknown) see above "One-time Dart plugin install"
- Install the Dart plugin, exit
- Verify installation of the Flutter plugin:
- Select
flutter-intellij [runIde]
in the Run Configuration drop-down list - Click Debug button (to the right of that drop-down)
- In the new IntelliJ process that spawns, open the
path/to/flutter/examples/hello_world
project - Choose
Edit Configurations...
in the Run Configuration drop-down list - Expand
Edit configuration templates...
and verify that Flutter is present - Click [+] and verify that Flutter is present
- Select
This is not currently required. However, for debugging unit tests it may be handy; please ignore for now.
The Gradle build script currently assumes that some dependencies are present in the artifacts
directory.
This project uses an External Tool in IntelliJ to ensure the dependencies are present. It appears that
external tools are not shareable. To make one, open the "Run Configuration" dialog and select "Flutter Plugin".
Look at the "Before launch" panel. It probably displays an Unknown External Tool. Double-click that, then click
edit icon in the new panel (pencil). Set the name to "Provision". Set the values:
- Program: /bin/bash
- Arguments: bin/plugin test -s
- Working directory:
$ProjectFileDir$ - You can select that from a list by clicking the "+" symbol in the field
There is a screenshot of this dialog in resources/intellij/Provision.png'.
Save, close, and re-open the "Run Configuration" dialog. Confirm that the External Tool is named "Provision".
If you know where the Application Support files are located for your version of IntelliJ,
you can drop the definition into its tools
directory before starting IntelliJ.
The definition is in resources/intellij/External Tools.xml
.
[Note: this may be out-of-date. It has not been verified recently.]
These are notes taken while making a Windows dev env for the Flutter plugin.
It assumes familiarity with the section about set-up on MacOS.
However, this configuration includes IntelliJ source code. Before starting,
ensure that git
is installed. If needed, download from https://gitforwindows.org/.
Also, Set the configuration property core.longpaths
to true; see the Git for Windows
FAQ for more info about that.
Launch command-line tool: git-bash (may need to install -- don't remember)
$ mkdir intellij
$ cd intellij
$ git clone https://github.com/JetBrains/intellij-plugins.git --branch 211.7442 --depth 1
$ git clone https://github.com/JetBrains/intellij-community.git --branch 211.7442 --depth 1
$ cd intellij-community
$ git clone https://github.com/JetBrains/android.git android --branch 211.7442 --depth 1
$ cd ..
$ git clone -c core.symlinks=true [email protected]:flutter/flutter-intellij.git
-
Copy the
org_mockito*
files fromflutter-intellij/.idea/libraries
tointellij-community/.idea/libraries
-
Launch IntelliJ 211.7442 or later
-
Open
intellij-community
as described in its docs -
Add
Dart-community
as described in its docs -
Open Project Structure on
Dart-community
-
Add dependencies, if needed
- modules
intellij.platform.ide.util.io
intellij.platform.core.ui
intellij.platform.codeStyle.ui
intellij.yaml
- libraries
fastutil-min
caffeine
javstringsimilarity
(the jar file is in the lib directory)
- modules
-
Save and close Project Structure
-
Open the Gradle tool window
-
Expand the tree:
dependencies > Tasks > other
-
Scroll down and double-click:
setupBundeledMaven
-
Select the run config: IDEA
-
Click the Debug button. If this is the first build, be prepared to wait a half hour.
-
The IDE should launch. Dart should be listed in the list of project types when creating a project.
-
Shut it down.
-
In Project Structure, import the module
flutter-intellij
- Do not import it as a Gradle module.
-
Add a dependency to it to
intellij.idea.community.main
using Project Structure -
Move it above Dart-community. This sets the class path to use the Flutter plugin version of some code duplicated from the Dart plugin.
-
Create an external tool named Provision. See the section above named
Provision Tool
.
- Download Dart dependencies from the command line:
cd path/to/flutter-intellij
flutter pub get
cd tool/plugin
flutter pub get
If exceptions like these occurred:
A problem occurred configuring project ':flutter-idea'.
> Source directory 'X:\path\to\your\flutter-intellij\flutter-idea\resources' is not a directory.
Check out if the directory is a symlink by open the link in IDEA, and it'll displayed as:
../resources
Delete the file, then create a Windows-style symlink manually using:
- Powershell:
New-Item -ItemType Junction -Path "flutter-idea/resources" -Target "resources"
- CMD:
mklink /j flutter-idea\resources resources
[Note: this may be out-of-date. It has not been verified recently.]
The repository contains two pre-defined test run configurations. One is for "unit" tests; that is currently defined as tests that do not rely on the IntelliJ UI APIs. The other is for "integration" tests - tests that do use the IntelliJ UI APIs. The integration tests are larger, long-running tests that exercise app use cases.
In order to be able to debug a single test class or test method you need to do the following:
- Open the test source file in the editor. Navigate to
flutter-idea/testSrc/unit/...
to open it. - Tests must run using Gradle, so be sure to open the source from the Gradle module.
- Find the test you want to run. Right-click the green triangle next to the test name and choose
Debug <test-name>
.
The test configuration can be tricky due to IntelliJ platform versioning. The plugin tool (below) can be a more reliable way to run tests.
To run unit tests on the command line:
bin/plugin test
See TestCommand
in tool/plugin/lib/plugin.dart
for more options.
It is also possible to run tests directly with Gradle, which would allow passing more command-line arguments:
./gradlew test
If you wanted to run a subset of the tests you could do so this way. See the Gradle docs for more info about testing. However, you must have run the tests once using the plugin tool, to ensure all the dependencies have been configured.
Sometimes browsing the source code of IntelliJ is helpful for understanding platform details that aren't documented.
- In order to have the platform sources handy, clone the IntelliJ IDEA Community Edition repo
(
git clone https://github.com/JetBrains/intellij-community
) - Sync it to the same version of IntelliJ as given by
baseVersion
in gradle.properties (git checkout 211.7628
). It will be in "detached HEAD" mode. - Open the Project Structure dialog (
File > Project Structure
). In theIntelliJ IDEA Community Edition
sdk, go to theSourcepaths
tab and add the path tointellij-community
. Accept all the root folders found by the IDE after scanning. - Do the same for the intellij-plugins repo to get Dart plugin sources. Sync to the same version as before.
Android Studio cannot use the Gradle-based project definition, so it still needs the flutter-intellij-community.iml
file. Obviously, unit tests can only be run from the command line.
- Initialize Android Studio sources.
- Checkout Flutter plugin sources, tip of tree.
- Follow the directions for setting up the Dart plugin sources in
intellij-plugins/Dart/README.md with these changes:
- you do not need to clone the intellij-community repo
- open studio-main/tools/adt/idea in IntelliJ
- possibly skip running intellij-community/getPlugins.sh
- Checkout Dart plugin sources.
- Using the Project Structure editor, import
- intellij-plugins/Dart/Dart-community.iml (if there are lots of errors, see step 7)
- flutter-intellij/flutter-intellij-community.iml
- Using the Project Structure editor, expand the tree to show
intellij > android > adt > ui
. Select theui
module then add a module dependency from it toflutter-intellij-community
. Also add a dependency on the Dart module unless using step 7. - (Optional, when Dart sources are not usable.) Make sure the
flutter-intellij-community
module has a dependency on a library namedDart
. It should be pre-defined, but if it is out-of-date then adjust it to point toflutter-intellij/third_party/lib/dart-plugin/xxx.yyyy/Dart.jar
. Delete the Dart module from the Project Structure modules list.
We use JxBrowser, a commercial product, to embed DevTools within IntelliJ. A license key is required to use this feature in development, but it is not required for developing unrelated (most) features.
Getting a key to develop JxBrowser features:
- Internal contributors: Ask another internal contributor to give you access to the key.
- External contributors: Our license key cannot be transferred externally, but you can acquire your own trial or regular license from TeamDev to use here.
To set up the license key:
- Copy the template at resources/jxbrowser/jxbrowser.properties.template and save it as resources/jxbrowser/jxbrowser.properties.
- Replace
<KEY>
with the actual key.
We require that all commits to the repository are signed with gpg. Github's documentation provides instructions, but if you are on OSX, the following tips may help:
- Download gpg's tarball along with its dependencies from here. gpg is the first item, the dependencies are in the block below (Libgpg-error, Libgcrypt, etc.).
- To install these tarballs on mac, follow these instructions:
- Download the desired .tar.gz or (.tar.bz2) file
- Open Terminal
- Extract the .tar.gz or (.tar.bz2) file with the following commands (Follow these steps for the dependencies first, then for gpg):
tar xvjf PACKAGENAME.tar.bz2 # Navigate to the extracted folder using cd command cd PACKAGENAME # Now run the following command to install the tarball ./configure make sudo make install
- You may need to install pinentry (
brew install pinentry
) - If pinentry continues to not work, check its path (
which pinentry
) and add it to the file~/.gnupg/gpg-agent.conf
, i.e.:pinentry-program /path/to/pinentry
- You may need to set the tty
export GPG_TTY=$(tty)
if you get this error when trying to commit:error: gpg failed to sign the data fatal: failed to write commit object