From d7b4cbb2a8f5e772e6aa71c4113d7ed11e32044c Mon Sep 17 00:00:00 2001 From: Michael Thomsen Date: Wed, 14 Feb 2018 17:05:26 +0100 Subject: [PATCH 01/31] Initial cut at Android Studio and Terminal experiences --- _layouts/default.html | 3 +- _sass/_tabs.scss | 67 ++++++++ css/main.scss | 3 +- getting-started-new.md | 214 +++++++++++++++++++++++++ images/flutter-starter-app-android.png | Bin 42480 -> 4323 bytes js/tabs.js | 58 +++++++ 6 files changed, 343 insertions(+), 2 deletions(-) create mode 100644 _sass/_tabs.scss create mode 100644 getting-started-new.md create mode 100644 js/tabs.js diff --git a/_layouts/default.html b/_layouts/default.html index 0c8a6733ce..003e802956 100644 --- a/_layouts/default.html +++ b/_layouts/default.html @@ -36,7 +36,8 @@ - + + diff --git a/_sass/_tabs.scss b/_sass/_tabs.scss new file mode 100644 index 0000000000..a6498cd331 --- /dev/null +++ b/_sass/_tabs.scss @@ -0,0 +1,67 @@ +$tab-accent-color: $brand-color; + +// General tabs. These are intended for instructions that vary according to user +// selection, e.g. around editor choice in getting started. + +ul.tabs__top-bar { + margin: 0; + padding: 0; + list-style: none; + display: inline; +} + +ul.tabs__top-bar li { + display: inline; + border: 1px solid $tab-accent-color; + padding: 5px 5px; + cursor: pointer; +} + +ul.tabs__top-bar li.current{ + background: $tab-accent-color; + color: $background-color; +} + +.tabs__content{ + display: none; + margin-top: 15px; + margin-bottom: 15px; +} + +.tabs__content.current{ + display: inherit; +} + +// OS Tabs (e.g. in Getting Started). These are intended for short terminal +// commands that are are OS specifc. + + +ul.ostabs__top-bar { + margin: 0; + padding: 0; + list-style: none; + display: inline; +} + +ul.ostabs__top-bar li { + display: inline; + border: 1px solid $tab-accent-color; + padding: 5px 5px; + cursor: pointer; +} + +ul.ostabs__top-bar li.current{ + background: $tab-accent-color; + color: $background-color; +} + +.ostabs__content{ + display: none; + margin-top: 15px; + margin-bottom: 15px; +} + +.ostabs__content.current{ + display: inherit; +} + diff --git a/css/main.scss b/css/main.scss index 741b759c8c..d79967f47e 100755 --- a/css/main.scss +++ b/css/main.scss @@ -61,7 +61,8 @@ $on-laptop: 800px; "code_pre", "catalog", "homepage", - "responsive_embeds" + "responsive_embeds", + "tabs" ; aside > :not(pre) > code[class*="language-"], aside > pre[class*="language-"] { diff --git a/getting-started-new.md b/getting-started-new.md new file mode 100644 index 0000000000..d9586cdfdf --- /dev/null +++ b/getting-started-new.md @@ -0,0 +1,214 @@ +--- +layout: page +title: Getting Started with Flutter +permalink: /getting-started-new/ +--- + +This page describes how to prepare your development environment to run Flutter +apps on Android. A [later step](todo) will detail how to run Flutter apps on iOS. + +## 1: Select your preferences + +Flutter is a flexible toolkit, so please start by selecting your development +tool of choice for writing, building, and running your Flutter app. + + + +
+ +*Android Studio:* A complete, integrated IDE experience for Flutter. + +## 2: Android Studio setup + + + +### 2a. Install Android Studio: + + * Download and install Android Studio 3.0 or later from the the [Android + Studio site](https://developer.android.com/studio/index.html) + +### 2b. Install the Flutter and Dart plugins: + + * The `Flutter` plugin powers Flutter developer workflows (running, + debugging, hot reload, etc.). + * The `Dart` plugin offers code analysis (code validation as you type, code + completions, etc.). + +Installation steps: + + 1. Start IntelliJ IDEA or Android Studio. + 1. Open plugin preferences (**Preferences>Plugins** on macOS, + **File>Settings>Plugins** on Windows & Linux). + 1. Select **Browse repositories…**, select the Flutter plug-in and click + `install`. + 1. Click `Yes` when prompted to install the Dart plugin. + 1. Click `Restart` when prompted. + +## 3: Installing the Flutter SDK, and creating your first Flutter app + + 1. Select **File>New Flutter Project** + 1. Under **Flutter SDK path**, select **Install SDK...**, and enter the + location where you want to install the Flutter SDK + 1. Click **OK** + 1. Wait for Android Studio to install the SDK, and create the project. + +## 4: Run the Flutter app + + 1. Locate the main Android Studio toolbar:
+ ![Main IntelliJ toolbar](/images/intellij/main-toolbar.png) + 1. In the **target selector**, select an Android device for running the app. + If none are listed as available, select **Tools>Android>AVD Manager** and + create one there. For details, see [Managing + AVDs](https://developer.android.com/studio/run/managing-avds.html). + 1. Click the **Run icon** in the toolbar, or invoke the menu item **Run > + Run**. + 1. If everything works, you should see your starter app on your device or + simulator:
+ ![Starter App on Android](/images/flutter-starter-app-android.png) + +## 5: Try a hot reload + +Flutter offers a fast development cycle with _hot reload_, the ability to reload +the code of a live running app without restarting or losing app state. Simply +make a change to your source code, tell your IDE or command-line tool that you +want to hot reload, and see the change in your simulator, emulator, or device. + + 1. Change the string `'Hello from Flutter!'` to `'Hello from my app!'` + 1. Do not press the 'Stop' button; let your app continue to run. + 1. To see your changes invoke **Save All** (`cmd-s` / `ctrl-s`), or click the + **Hot Reload button** (the button with the lightning bolt icon). + +You should see the updated string in the running app almost immediately. + +
+ +
+ +*VS Code:* A light-weight editor with Flutter run and debug support. + +## 2: Android Studio setup + +**TODO TODO TODO TODO TODO TODO TODO.** + +
+ +
+ +*Terminal + editor:* Your editor-of-choice combined with Flutter's terminal tool +for running and building. + +## 2: Android Studio setup + + + + 1. Download and install Android Studio 3.0 or later from the the [Android + Studio site](https://developer.android.com/studio/index.html) + 1. Start Android Studio, and go through the 'Android Studio Setup Wizard'. + This will install the latest Android SDK, Android SDK Platform-Tools, and + Android SDK Build-Tools, which are required by Flutter when developing for + Android. + 1. Select **File>New Project** to create a regular Android project, and wait + for it to initialize. Then select **Tools>Android>AVD Manager** make sure + at least one Emulator image has been defined. + 1. Start the Emulator image. + +## 3: Installing the Flutter SDK + + 1. Download the latest beta SDK from the [Flutter download page](todo). + 1. Select the desired installation location, and unzip the downloaded SDK: + {% commandline %} + cd /users/Obiwan/development/ + unzip /users/Obiwan/downloads/flutter-sdk.zip + cd flutter + export PATH=`pwd`/flutter/bin:$PATH + {% endcommandline %} + +## 4: Validate your setup with the flutter doctor + + 1. Run the following command to see if there are any dependencies you need to + install to complete the setup: + {% commandline %} + flutter doctor + {% endcommandline %} + +This command checks your environment and displays a report to the terminal window. +The Dart SDK is bundled with Flutter; it is not necessary to install Dart separately. +Check the output carefully for other software you may need to install or further +tasks to perform (shown in **bold** text). + +For example: +``` +[-] Android toolchain - develop for Android devices + • Android SDK at /Users/obiwan/Library/Android/sdk + ✗ Android SDK is missing command line tools; download from https://goo.gl/XxQghQ + • Try re-installing or updating your Android SDK, + visit https://flutter.io/setup/#android-setup for detailed instructions. +``` + +The first time you run a flutter command (such as `flutter doctor`), it downloads its own dependencies and compiles +itself. Subsequent runs should be much faster. + +## 4: Creating your first Flutter app + + 1. Use the `flutter create` command to create a new project: + {% commandline %} + cd /users/Obiwan/projects/ + flutter create hello_flutter + cd hello_flutter + {% endcommandline %} + +## 5: Run the Flutter app + + 1. Check that an Android device is running. If none is shown, go back to step 2. + {% commandline %} + flutter devices + {% endcommandline %} + 1. Run the app with the `flutter run command`: + {% commandline %} + flutter run + {% endcommandline %} + + 1. If everything works, after the app has been built, you should see your + starter app on your device or simulator:
+ ![Starter App on Android](/images/flutter-starter-app-android.png) + +## 6: Try a hot reload + +Flutter offers a fast development cycle with _hot reload_, the ability to reload +the code of a live running app without restarting or losing app state. Simply +make a change to your source code, tell your IDE or command-line tool that you +want to hot reload, and see the change in your simulator, emulator, or device. + + 1. Open the file `lib/main.dart` in your favorite Dart code editor + 1. Change the string `'Hello from Flutter!'` to `'Hello from my app!'` + 1. Do not press the 'Stop' button; let your app continue to run. + 1. To see your changes invoke **Save All** (`cmd-s` / `ctrl-s`), or click the + **Hot Reload button** (the button with the lightning bolt icon). + +You should see the updated string in the running app almost immediately. + + + +
+ +## Next steps + +Now that you have your first Flutter app running, and have experienced 'hot +reload', let's learn some core Flutter concepts, and [extend the 'Hello from +Flutter'-app](/getting-started/app/) to a more complete app. \ No newline at end of file diff --git a/images/flutter-starter-app-android.png b/images/flutter-starter-app-android.png index 1f2dee0fc885b799461af58cf53989f736778207..cc1d296a6de118e357f5e5772456969c6d08e56d 100644 GIT binary patch literal 4323 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 literal 42480 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≦U1`(p} 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 FV1jJ7;!FSl diff --git a/js/tabs.js b/js/tabs.js new file mode 100644 index 0000000000..19a9083fd5 --- /dev/null +++ b/js/tabs.js @@ -0,0 +1,58 @@ +function setupToolsTabs() { + var tabs = $('.tabs__top-bar li'); + var tabContents = $('.tabs__content'); + + function clearTabsCurrent() { + tabs.removeClass('current'); + tabContents.removeClass('current'); + } + + tabs.click(function () { + clearTabsCurrent(); + + var tab_id = $(this).attr('data-tab'); + + $(this).addClass('current'); + $("#" + tab_id).addClass('current'); + }); +} + +function setupOsTabs() { + var tabs = $('.ostabs__top-bar li'); + var tabContents = $('.ostabs__content'); + + function clearTabsCurrent() { + tabs.removeClass('current'); + tabContents.removeClass('current'); + } + + tabs.click(function () { + clearTabsCurrent(); + + var tab_id = $(this).attr('data-tab'); + + $(this).addClass('current'); + $("#" + tab_id).addClass('current'); + }); + + // The following selects the correct default tab in /guides/get-started + function selectOperatingSystemInTabs(osName) { + clearTabsCurrent(); + + $("li[data-tab='tab-sdk-install-" + osName + "']").addClass('current'); + $('#tab-sdk-install-' + osName).addClass('current'); + } + + if (window.navigator.userAgent.indexOf("Mac") != -1) { + selectOperatingSystemInTabs('mac'); + } else if (window.navigator.userAgent.indexOf("Linux") != -1 && + window.navigator.userAgent.indexOf("Android") == -1) { + // Doesn't auto-select the Linux tab when on Android. + selectOperatingSystemInTabs('linux'); + } +} + +$(document).ready(function () { + setupToolsTabs(); + setupOsTabs(); +}); \ No newline at end of file From 37a59b84afe2abd46ef147c352b8c650758d526e Mon Sep 17 00:00:00 2001 From: Michael Thomsen Date: Wed, 14 Feb 2018 17:30:10 +0100 Subject: [PATCH 02/31] Use OS steps in the Terminal case --- _sass/_tabs.scss | 12 ++++++------ getting-started-new.md | 37 ++++++++++++++++++++++++++++++------- js/tabs.js | 4 ++-- 3 files changed, 38 insertions(+), 15 deletions(-) diff --git a/_sass/_tabs.scss b/_sass/_tabs.scss index a6498cd331..5f061b8d99 100644 --- a/_sass/_tabs.scss +++ b/_sass/_tabs.scss @@ -35,17 +35,16 @@ ul.tabs__top-bar li.current{ // OS Tabs (e.g. in Getting Started). These are intended for short terminal // commands that are are OS specifc. - ul.ostabs__top-bar { margin: 0; padding: 0; list-style: none; - display: inline; } ul.ostabs__top-bar li { - display: inline; - border: 1px solid $tab-accent-color; + background: none; + color: $grey-color; + display: inline-block; padding: 5px 5px; cursor: pointer; } @@ -57,8 +56,9 @@ ul.ostabs__top-bar li.current{ .ostabs__content{ display: none; - margin-top: 15px; - margin-bottom: 15px; + border: 1px solid $tab-accent-color; + padding: 5px; + margin-bottom: 5px; } .ostabs__content.current{ diff --git a/getting-started-new.md b/getting-started-new.md index d9586cdfdf..3f3c28fd60 100644 --- a/getting-started-new.md +++ b/getting-started-new.md @@ -127,13 +127,36 @@ Flutter apps in your editor of choice. ## 3: Installing the Flutter SDK 1. Download the latest beta SDK from the [Flutter download page](todo). - 1. Select the desired installation location, and unzip the downloaded SDK: - {% commandline %} - cd /users/Obiwan/development/ - unzip /users/Obiwan/downloads/flutter-sdk.zip - cd flutter - export PATH=`pwd`/flutter/bin:$PATH - {% endcommandline %} + 1. Install the downloaded SDK: + +
    + + + +
+
+ 1. In Windows Explorer, navigate to 'Downloads' + 1. Double click `flutter-sdk.zip` + 1. Click Extract + 1. Place the extracted files in your desired directory +
+
+``` +cd /users/Obiwan/development/ +unzip /users/Obiwan/downloads/flutter-sdk.zip +cd flutter +export PATH=`pwd`/flutter/bin:$PATH +``` +
+
+``` +cd /users/Obiwan/development/ +unzip /users/Obiwan/downloads/flutter-sdk.zip +cd flutter +export PATH=`pwd`/flutter/bin:$PATH +``` +
+ ## 4: Validate your setup with the flutter doctor diff --git a/js/tabs.js b/js/tabs.js index 19a9083fd5..f8fd352b88 100644 --- a/js/tabs.js +++ b/js/tabs.js @@ -39,8 +39,8 @@ function setupOsTabs() { function selectOperatingSystemInTabs(osName) { clearTabsCurrent(); - $("li[data-tab='tab-sdk-install-" + osName + "']").addClass('current'); - $('#tab-sdk-install-' + osName).addClass('current'); + $("li[data-tab='tab-os-install-" + osName + "']").addClass('current'); + $('#tab-os-install-' + osName).addClass('current'); } if (window.navigator.userAgent.indexOf("Mac") != -1) { From 54f62a5a4004e59d64b81ad7fa7d6c81360c0472 Mon Sep 17 00:00:00 2001 From: Michael Thomsen Date: Fri, 16 Feb 2018 09:14:10 +0100 Subject: [PATCH 03/31] Make new getting started default in this branch --- getting-started-new.md | 237 ---------------------------------- getting-started-old.md | 119 +++++++++++++++++ getting-started.md | 282 +++++++++++++++++++++++++++++------------ 3 files changed, 319 insertions(+), 319 deletions(-) delete mode 100644 getting-started-new.md create mode 100644 getting-started-old.md diff --git a/getting-started-new.md b/getting-started-new.md deleted file mode 100644 index 3f3c28fd60..0000000000 --- a/getting-started-new.md +++ /dev/null @@ -1,237 +0,0 @@ ---- -layout: page -title: Getting Started with Flutter -permalink: /getting-started-new/ ---- - -This page describes how to prepare your development environment to run Flutter -apps on Android. A [later step](todo) will detail how to run Flutter apps on iOS. - -## 1: Select your preferences - -Flutter is a flexible toolkit, so please start by selecting your development -tool of choice for writing, building, and running your Flutter app. - -
    - - - -
- -
- -*Android Studio:* A complete, integrated IDE experience for Flutter. - -## 2: Android Studio setup - - - -### 2a. Install Android Studio: - - * Download and install Android Studio 3.0 or later from the the [Android - Studio site](https://developer.android.com/studio/index.html) - -### 2b. Install the Flutter and Dart plugins: - - * The `Flutter` plugin powers Flutter developer workflows (running, - debugging, hot reload, etc.). - * The `Dart` plugin offers code analysis (code validation as you type, code - completions, etc.). - -Installation steps: - - 1. Start IntelliJ IDEA or Android Studio. - 1. Open plugin preferences (**Preferences>Plugins** on macOS, - **File>Settings>Plugins** on Windows & Linux). - 1. Select **Browse repositories…**, select the Flutter plug-in and click - `install`. - 1. Click `Yes` when prompted to install the Dart plugin. - 1. Click `Restart` when prompted. - -## 3: Installing the Flutter SDK, and creating your first Flutter app - - 1. Select **File>New Flutter Project** - 1. Under **Flutter SDK path**, select **Install SDK...**, and enter the - location where you want to install the Flutter SDK - 1. Click **OK** - 1. Wait for Android Studio to install the SDK, and create the project. - -## 4: Run the Flutter app - - 1. Locate the main Android Studio toolbar:
- ![Main IntelliJ toolbar](/images/intellij/main-toolbar.png) - 1. In the **target selector**, select an Android device for running the app. - If none are listed as available, select **Tools>Android>AVD Manager** and - create one there. For details, see [Managing - AVDs](https://developer.android.com/studio/run/managing-avds.html). - 1. Click the **Run icon** in the toolbar, or invoke the menu item **Run > - Run**. - 1. If everything works, you should see your starter app on your device or - simulator:
- ![Starter App on Android](/images/flutter-starter-app-android.png) - -## 5: Try a hot reload - -Flutter offers a fast development cycle with _hot reload_, the ability to reload -the code of a live running app without restarting or losing app state. Simply -make a change to your source code, tell your IDE or command-line tool that you -want to hot reload, and see the change in your simulator, emulator, or device. - - 1. Change the string `'Hello from Flutter!'` to `'Hello from my app!'` - 1. Do not press the 'Stop' button; let your app continue to run. - 1. To see your changes invoke **Save All** (`cmd-s` / `ctrl-s`), or click the - **Hot Reload button** (the button with the lightning bolt icon). - -You should see the updated string in the running app almost immediately. - -
- -
- -*VS Code:* A light-weight editor with Flutter run and debug support. - -## 2: Android Studio setup - -**TODO TODO TODO TODO TODO TODO TODO.** - -
- -
- -*Terminal + editor:* Your editor-of-choice combined with Flutter's terminal tool -for running and building. - -## 2: Android Studio setup - - - - 1. Download and install Android Studio 3.0 or later from the the [Android - Studio site](https://developer.android.com/studio/index.html) - 1. Start Android Studio, and go through the 'Android Studio Setup Wizard'. - This will install the latest Android SDK, Android SDK Platform-Tools, and - Android SDK Build-Tools, which are required by Flutter when developing for - Android. - 1. Select **File>New Project** to create a regular Android project, and wait - for it to initialize. Then select **Tools>Android>AVD Manager** make sure - at least one Emulator image has been defined. - 1. Start the Emulator image. - -## 3: Installing the Flutter SDK - - 1. Download the latest beta SDK from the [Flutter download page](todo). - 1. Install the downloaded SDK: - -
    - - - -
-
- 1. In Windows Explorer, navigate to 'Downloads' - 1. Double click `flutter-sdk.zip` - 1. Click Extract - 1. Place the extracted files in your desired directory -
-
-``` -cd /users/Obiwan/development/ -unzip /users/Obiwan/downloads/flutter-sdk.zip -cd flutter -export PATH=`pwd`/flutter/bin:$PATH -``` -
-
-``` -cd /users/Obiwan/development/ -unzip /users/Obiwan/downloads/flutter-sdk.zip -cd flutter -export PATH=`pwd`/flutter/bin:$PATH -``` -
- - -## 4: Validate your setup with the flutter doctor - - 1. Run the following command to see if there are any dependencies you need to - install to complete the setup: - {% commandline %} - flutter doctor - {% endcommandline %} - -This command checks your environment and displays a report to the terminal window. -The Dart SDK is bundled with Flutter; it is not necessary to install Dart separately. -Check the output carefully for other software you may need to install or further -tasks to perform (shown in **bold** text). - -For example: -``` -[-] Android toolchain - develop for Android devices - • Android SDK at /Users/obiwan/Library/Android/sdk - ✗ Android SDK is missing command line tools; download from https://goo.gl/XxQghQ - • Try re-installing or updating your Android SDK, - visit https://flutter.io/setup/#android-setup for detailed instructions. -``` - -The first time you run a flutter command (such as `flutter doctor`), it downloads its own dependencies and compiles -itself. Subsequent runs should be much faster. - -## 4: Creating your first Flutter app - - 1. Use the `flutter create` command to create a new project: - {% commandline %} - cd /users/Obiwan/projects/ - flutter create hello_flutter - cd hello_flutter - {% endcommandline %} - -## 5: Run the Flutter app - - 1. Check that an Android device is running. If none is shown, go back to step 2. - {% commandline %} - flutter devices - {% endcommandline %} - 1. Run the app with the `flutter run command`: - {% commandline %} - flutter run - {% endcommandline %} - - 1. If everything works, after the app has been built, you should see your - starter app on your device or simulator:
- ![Starter App on Android](/images/flutter-starter-app-android.png) - -## 6: Try a hot reload - -Flutter offers a fast development cycle with _hot reload_, the ability to reload -the code of a live running app without restarting or losing app state. Simply -make a change to your source code, tell your IDE or command-line tool that you -want to hot reload, and see the change in your simulator, emulator, or device. - - 1. Open the file `lib/main.dart` in your favorite Dart code editor - 1. Change the string `'Hello from Flutter!'` to `'Hello from my app!'` - 1. Do not press the 'Stop' button; let your app continue to run. - 1. To see your changes invoke **Save All** (`cmd-s` / `ctrl-s`), or click the - **Hot Reload button** (the button with the lightning bolt icon). - -You should see the updated string in the running app almost immediately. - -
    Current development OS: - - - -
- -
- -## Next steps - -Now that you have your first Flutter app running, and have experienced 'hot -reload', let's learn some core Flutter concepts, and [extend the 'Hello from -Flutter'-app](/getting-started/app/) to a more complete app. \ No newline at end of file diff --git a/getting-started-old.md b/getting-started-old.md new file mode 100644 index 0000000000..ea2318f750 --- /dev/null +++ b/getting-started-old.md @@ -0,0 +1,119 @@ +--- +layout: page +title: Getting started with your first Flutter app + +permalink: /getting-started-old/ +--- + +This page describes how to create and run your first Flutter app. + +{% include note.html content="The Flutter SDK is a prerequisite for the tasks on this page. +Make sure you [install the Flutter SDK](/setup/) before continuing." %} + +* Placeholder for TOC +{:toc} + +## Creating your first Flutter app + +To create a starter project, open a terminal and run the `flutter create ` command . + +Here is an example: + +{% commandline %} +flutter create myapp +{% endcommandline %} + +The above command creates a Flutter project directory called `myapp` that contains a simple demo +app that uses [Material Design](https://www.google.com/design/spec/material-design/introduction.html). + +In the project directory, the code for your app is in `myapp/lib/main.dart`. + +## Running your Flutter app + +Use the `flutter run` command to run your Flutter app on a connected +device or simulator. + +To run your app from the command-line: + +1. Open a terminal and change directories to the root of your app (the same directory that +contains the `pubspec.yaml` file for your project). +2. Run the following command. Once the `flutter` tool is running, if you change the app's +source code, you can hit `r` to hot-reload your application (updating the source on the fly +without actually restarting the entire app). + +{% commandline %} +cd myapp +flutter run +{% endcommandline %} + + +If more than one device is connected, use the `flutter devices` command +to get their IDs, and then `flutter run -d deviceID` to run your app. + +Alternatively, if you are using the [IntelliJ +IDEA](https://www.jetbrains.com/idea/) IDE (either the free Community Edition, or the +Ultimate Edition) with the [Flutter +plugins](/ide-setup/), you can start your Flutter app from there: + +1. In IntelliJ, click **Create New Project** from the Welcome window or +**File > New > Project...** from the main IDE window. +1. Select **Flutter** in the menu, and click **Next**. +1. Under **Project location** enter, or browse to, the directory holding your new Flutter app. +1. Click **Finish**. +1. Click the **Run icon** in the toolbar, or invoke the menu item **Run > Run**. + +![Main IntelliJ toolbar](/images/intellij/main-toolbar.png) + +*Note*: If the Run & Debug buttons are disabled, and no targets are listed, Flutter +has not been able to discover any connected iOS or Android devices or simulators. +You need to connect a device, or start a simulator, to proceed. + +If everything works, you should see your starter app on your device or simulator. + +
+
+ Starter App on iOS +
Figure 1. iOS (iPhone 6s Plus)
+
+
+ Starter App on Android +
Figure 2. Android (Nexus 6P)
+
+
+ +## Quickly viewing source code changes with 'hot reload' + +Flutter offers a fast development cycle with _hot reload_, +the ability to reload the code of a live running app +without restarting or losing app state. Simply make a +change to your source code, tell your IDE or command-line +tool that you want to hot reload, and see the change +in your simulator, emulator, or device. + +![Hot reload in IntelliJ](/images/intellij/hot-reload.gif) + +To edit your code and hot reload changes: + +1. Start your app with 'Run' (without breakpoints) or 'Debug' (with breakpoints). +1. Make desired changes in your source code. +1. Do not press the 'Stop' button; let your app continue to run. +1. To see your changes invoke **Save All** (`cmd-s` / `ctrl-s`), + or click the **Hot Reload button** (the button with the lightning bolt icon). + +A more detailed description on how to use the IntelliJ plugin and which +changes are supported by the hot reload feature can be found on the page +[Developing apps in the IntelliJ IDE](../using-ide/). + +## Next steps + +Please reach out to us at our [mailing list][mailinglist]. We'd love +to hear from you! + +You might also want to check out: +* [Building Beautiful UIs with Flutter - Codelab](https://codelabs.developers.google.com/codelabs/flutter/index.html#0) +* [Introduction to Flutter's Widget Framework](/widgets-intro/) + +Happy Fluttering! + + +[mailinglist]: mailto:flutter-dev@googlegroups.com diff --git a/getting-started.md b/getting-started.md index 2d13d3f494..3f3c28fd60 100644 --- a/getting-started.md +++ b/getting-started.md @@ -1,119 +1,237 @@ --- layout: page -title: Getting started with your first Flutter app - -permalink: /getting-started/ +title: Getting Started with Flutter +permalink: /getting-started-new/ --- -This page describes how to create and run your first Flutter app. +This page describes how to prepare your development environment to run Flutter +apps on Android. A [later step](todo) will detail how to run Flutter apps on iOS. -{% include note.html content="The Flutter SDK is a prerequisite for the tasks on this page. -Make sure you [install the Flutter SDK](/setup/) before continuing." %} +## 1: Select your preferences -* Placeholder for TOC -{:toc} +Flutter is a flexible toolkit, so please start by selecting your development +tool of choice for writing, building, and running your Flutter app. -## Creating your first Flutter app +
    + + + +
-To create a starter project, open a terminal and run the `flutter create ` command . +
-Here is an example: +*Android Studio:* A complete, integrated IDE experience for Flutter. -{% commandline %} -flutter create myapp -{% endcommandline %} +## 2: Android Studio setup -The above command creates a Flutter project directory called `myapp` that contains a simple demo -app that uses [Material Design](https://www.google.com/design/spec/material-design/introduction.html). + -In the project directory, the code for your app is in `myapp/lib/main.dart`. +### 2a. Install Android Studio: -## Running your Flutter app + * Download and install Android Studio 3.0 or later from the the [Android + Studio site](https://developer.android.com/studio/index.html) -Use the `flutter run` command to run your Flutter app on a connected -device or simulator. +### 2b. Install the Flutter and Dart plugins: -To run your app from the command-line: + * The `Flutter` plugin powers Flutter developer workflows (running, + debugging, hot reload, etc.). + * The `Dart` plugin offers code analysis (code validation as you type, code + completions, etc.). -1. Open a terminal and change directories to the root of your app (the same directory that -contains the `pubspec.yaml` file for your project). -2. Run the following command. Once the `flutter` tool is running, if you change the app's -source code, you can hit `r` to hot-reload your application (updating the source on the fly -without actually restarting the entire app). +Installation steps: -{% commandline %} -cd myapp -flutter run -{% endcommandline %} + 1. Start IntelliJ IDEA or Android Studio. + 1. Open plugin preferences (**Preferences>Plugins** on macOS, + **File>Settings>Plugins** on Windows & Linux). + 1. Select **Browse repositories…**, select the Flutter plug-in and click + `install`. + 1. Click `Yes` when prompted to install the Dart plugin. + 1. Click `Restart` when prompted. +## 3: Installing the Flutter SDK, and creating your first Flutter app -If more than one device is connected, use the `flutter devices` command -to get their IDs, and then `flutter run -d deviceID` to run your app. + 1. Select **File>New Flutter Project** + 1. Under **Flutter SDK path**, select **Install SDK...**, and enter the + location where you want to install the Flutter SDK + 1. Click **OK** + 1. Wait for Android Studio to install the SDK, and create the project. -Alternatively, if you are using the [IntelliJ -IDEA](https://www.jetbrains.com/idea/) IDE (either the free Community Edition, or the -Ultimate Edition) with the [Flutter -plugins](/ide-setup/), you can start your Flutter app from there: +## 4: Run the Flutter app -1. In IntelliJ, click **Create New Project** from the Welcome window or -**File > New > Project...** from the main IDE window. -1. Select **Flutter** in the menu, and click **Next**. -1. Under **Project location** enter, or browse to, the directory holding your new Flutter app. -1. Click **Finish**. -1. Click the **Run icon** in the toolbar, or invoke the menu item **Run > Run**. + 1. Locate the main Android Studio toolbar:
+ ![Main IntelliJ toolbar](/images/intellij/main-toolbar.png) + 1. In the **target selector**, select an Android device for running the app. + If none are listed as available, select **Tools>Android>AVD Manager** and + create one there. For details, see [Managing + AVDs](https://developer.android.com/studio/run/managing-avds.html). + 1. Click the **Run icon** in the toolbar, or invoke the menu item **Run > + Run**. + 1. If everything works, you should see your starter app on your device or + simulator:
+ ![Starter App on Android](/images/flutter-starter-app-android.png) -![Main IntelliJ toolbar](/images/intellij/main-toolbar.png) +## 5: Try a hot reload -*Note*: If the Run & Debug buttons are disabled, and no targets are listed, Flutter -has not been able to discover any connected iOS or Android devices or simulators. -You need to connect a device, or start a simulator, to proceed. +Flutter offers a fast development cycle with _hot reload_, the ability to reload +the code of a live running app without restarting or losing app state. Simply +make a change to your source code, tell your IDE or command-line tool that you +want to hot reload, and see the change in your simulator, emulator, or device. -If everything works, you should see your starter app on your device or simulator. + 1. Change the string `'Hello from Flutter!'` to `'Hello from my app!'` + 1. Do not press the 'Stop' button; let your app continue to run. + 1. To see your changes invoke **Save All** (`cmd-s` / `ctrl-s`), or click the + **Hot Reload button** (the button with the lightning bolt icon). -
-
- Starter App on iOS -
Figure 1. iOS (iPhone 6s Plus)
-
-
- Starter App on Android -
Figure 2. Android (Nexus 6P)
-
-
+You should see the updated string in the running app almost immediately. -## Quickly viewing source code changes with 'hot reload' +
-Flutter offers a fast development cycle with _hot reload_, -the ability to reload the code of a live running app -without restarting or losing app state. Simply make a -change to your source code, tell your IDE or command-line -tool that you want to hot reload, and see the change -in your simulator, emulator, or device. +
-![Hot reload in IntelliJ](/images/intellij/hot-reload.gif) +*VS Code:* A light-weight editor with Flutter run and debug support. -To edit your code and hot reload changes: +## 2: Android Studio setup -1. Start your app with 'Run' (without breakpoints) or 'Debug' (with breakpoints). -1. Make desired changes in your source code. -1. Do not press the 'Stop' button; let your app continue to run. -1. To see your changes invoke **Save All** (`cmd-s` / `ctrl-s`), - or click the **Hot Reload button** (the button with the lightning bolt icon). +**TODO TODO TODO TODO TODO TODO TODO.** -A more detailed description on how to use the IntelliJ plugin and which -changes are supported by the hot reload feature can be found on the page -[Developing apps in the IntelliJ IDE](../using-ide/). +
-## Next steps +
+ +*Terminal + editor:* Your editor-of-choice combined with Flutter's terminal tool +for running and building. + +## 2: Android Studio setup + + + + 1. Download and install Android Studio 3.0 or later from the the [Android + Studio site](https://developer.android.com/studio/index.html) + 1. Start Android Studio, and go through the 'Android Studio Setup Wizard'. + This will install the latest Android SDK, Android SDK Platform-Tools, and + Android SDK Build-Tools, which are required by Flutter when developing for + Android. + 1. Select **File>New Project** to create a regular Android project, and wait + for it to initialize. Then select **Tools>Android>AVD Manager** make sure + at least one Emulator image has been defined. + 1. Start the Emulator image. + +## 3: Installing the Flutter SDK + + 1. Download the latest beta SDK from the [Flutter download page](todo). + 1. Install the downloaded SDK: + +
    + + + +
+
+ 1. In Windows Explorer, navigate to 'Downloads' + 1. Double click `flutter-sdk.zip` + 1. Click Extract + 1. Place the extracted files in your desired directory +
+
+``` +cd /users/Obiwan/development/ +unzip /users/Obiwan/downloads/flutter-sdk.zip +cd flutter +export PATH=`pwd`/flutter/bin:$PATH +``` +
+
+``` +cd /users/Obiwan/development/ +unzip /users/Obiwan/downloads/flutter-sdk.zip +cd flutter +export PATH=`pwd`/flutter/bin:$PATH +``` +
-Please reach out to us at our [mailing list][mailinglist]. We'd love -to hear from you! -You might also want to check out: -* [Building Beautiful UIs with Flutter - Codelab](https://codelabs.developers.google.com/codelabs/flutter/index.html#0) -* [Introduction to Flutter's Widget Framework](/widgets-intro/) +## 4: Validate your setup with the flutter doctor + + 1. Run the following command to see if there are any dependencies you need to + install to complete the setup: + {% commandline %} + flutter doctor + {% endcommandline %} + +This command checks your environment and displays a report to the terminal window. +The Dart SDK is bundled with Flutter; it is not necessary to install Dart separately. +Check the output carefully for other software you may need to install or further +tasks to perform (shown in **bold** text). + +For example: +``` +[-] Android toolchain - develop for Android devices + • Android SDK at /Users/obiwan/Library/Android/sdk + ✗ Android SDK is missing command line tools; download from https://goo.gl/XxQghQ + • Try re-installing or updating your Android SDK, + visit https://flutter.io/setup/#android-setup for detailed instructions. +``` + +The first time you run a flutter command (such as `flutter doctor`), it downloads its own dependencies and compiles +itself. Subsequent runs should be much faster. + +## 4: Creating your first Flutter app + + 1. Use the `flutter create` command to create a new project: + {% commandline %} + cd /users/Obiwan/projects/ + flutter create hello_flutter + cd hello_flutter + {% endcommandline %} + +## 5: Run the Flutter app + + 1. Check that an Android device is running. If none is shown, go back to step 2. + {% commandline %} + flutter devices + {% endcommandline %} + 1. Run the app with the `flutter run command`: + {% commandline %} + flutter run + {% endcommandline %} + + 1. If everything works, after the app has been built, you should see your + starter app on your device or simulator:
+ ![Starter App on Android](/images/flutter-starter-app-android.png) + +## 6: Try a hot reload + +Flutter offers a fast development cycle with _hot reload_, the ability to reload +the code of a live running app without restarting or losing app state. Simply +make a change to your source code, tell your IDE or command-line tool that you +want to hot reload, and see the change in your simulator, emulator, or device. + + 1. Open the file `lib/main.dart` in your favorite Dart code editor + 1. Change the string `'Hello from Flutter!'` to `'Hello from my app!'` + 1. Do not press the 'Stop' button; let your app continue to run. + 1. To see your changes invoke **Save All** (`cmd-s` / `ctrl-s`), or click the + **Hot Reload button** (the button with the lightning bolt icon). + +You should see the updated string in the running app almost immediately. + +
    Current development OS: + + + +
-Happy Fluttering! +
+## Next steps -[mailinglist]: mailto:flutter-dev@googlegroups.com +Now that you have your first Flutter app running, and have experienced 'hot +reload', let's learn some core Flutter concepts, and [extend the 'Hello from +Flutter'-app](/getting-started/app/) to a more complete app. \ No newline at end of file From dafe24417a5af80d4a08576e7c436c16655a0c5f Mon Sep 17 00:00:00 2001 From: Michael Thomsen Date: Fri, 16 Feb 2018 09:19:36 +0100 Subject: [PATCH 04/31] Link to new page --- getting-started.md | 2 +- index.md | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/getting-started.md b/getting-started.md index 3f3c28fd60..d0fff10f85 100644 --- a/getting-started.md +++ b/getting-started.md @@ -1,7 +1,7 @@ --- layout: page title: Getting Started with Flutter -permalink: /getting-started-new/ +permalink: /getting-started/ --- This page describes how to prepare your development environment to run Flutter diff --git a/index.md b/index.md index e391bfd1d4..dc67d6d222 100644 --- a/index.md +++ b/index.md @@ -21,7 +21,7 @@ hide_title: true
- Get Started + Get Started {% include note.html content="_Flutter is an alpha, open-source project_." %}
@@ -292,7 +292,7 @@ Future getBatteryLevel() async {
Try Flutter today. Getting started is easy.
- Get Started + Get Started {% include note.html content="_Flutter is an alpha, open-source project_." %}
From 70b6e14b88e85e5afa363053fc3429326e56476f Mon Sep 17 00:00:00 2001 From: Michael Thomsen Date: Wed, 21 Feb 2018 15:03:37 +0100 Subject: [PATCH 05/31] Stub out complete end to end flow --- _includes/sidebar.html | 9 +++++---- get-started/core-concepts.md | 11 +++++++++++ get-started/create-and-run.md | 13 +++++++++++++ get-started/learn-more.md | 18 ++++++++++++++++++ get-started/overview.md | 17 +++++++++++++++++ get-started/setup-ios.md | 6 ++++++ get-started/setup-path.md | 6 ++++++ getting-started.md => get-started/setup.md | 18 ++++++++++-------- index.md | 4 ++-- 9 files changed, 88 insertions(+), 14 deletions(-) create mode 100644 get-started/core-concepts.md create mode 100644 get-started/create-and-run.md create mode 100644 get-started/learn-more.md create mode 100644 get-started/overview.md create mode 100644 get-started/setup-ios.md create mode 100644 get-started/setup-path.md rename getting-started.md => get-started/setup.md (95%) diff --git a/_includes/sidebar.html b/_includes/sidebar.html index 4a3d71785e..bb3db68f41 100644 --- a/_includes/sidebar.html +++ b/_includes/sidebar.html @@ -3,10 +3,11 @@ diff --git a/get-started/core-concepts.md b/get-started/core-concepts.md new file mode 100644 index 0000000000..0b88cba722 --- /dev/null +++ b/get-started/core-concepts.md @@ -0,0 +1,11 @@ +--- +layout: page +title: "Get Started: Core Concepts Tutorial" +permalink: /get-started/core-concepts/ +--- + +This is a placeholder for [the new core concepts tutorial](https://github.com/flutter/website/pull/798). + +## Next step + +[Next step: Learn more](/get-started/learn-more/) diff --git a/get-started/create-and-run.md b/get-started/create-and-run.md new file mode 100644 index 0000000000..aa87631e21 --- /dev/null +++ b/get-started/create-and-run.md @@ -0,0 +1,13 @@ +--- +layout: page +title: "Get Started: Create and Run Your First App" +permalink: /get-started/create-and-run/ +--- + +TODO + +## Next step + +Let's learn some core Flutter concepts, by creating a small app. + +[Next step: Core Concepts Tutorial](/get-started/core-concepts/) diff --git a/get-started/learn-more.md b/get-started/learn-more.md new file mode 100644 index 0000000000..36eb29686f --- /dev/null +++ b/get-started/learn-more.md @@ -0,0 +1,18 @@ +--- +layout: page +title: "Get Started: Learn More" +permalink: /get-started/learn-more/ +--- + +* Additional installation and setup + * [Flutter on iOS installation and setup](/get-started/setup-ios) + * [Add the `flutter` command to path](/get-started/setup-path/) + +* Learn more about the Flutter framework + * [A Tour of the Flutter Widget Framework](/widgets-intro/) + * [Flutter for Android Developers](/flutter-for-android/) + * [Building beautiful UIs - Codelab](https://codelabs.developers.google.com/codelabs/flutter/) + * [Firebase for Flutter - Codelab](https://codelabs.developers.google.com/codelabs/flutter-firebase/) + +* Other resources + * [Bootstrap into Dart: learn more about the language](/bootstrap-into-dart/) \ No newline at end of file diff --git a/get-started/overview.md b/get-started/overview.md new file mode 100644 index 0000000000..ee63c55fa3 --- /dev/null +++ b/get-started/overview.md @@ -0,0 +1,17 @@ +--- +layout: page +title: "Get Started: Overview" +permalink: /get-started/ +--- + +Welcome to the Flutter Get Started Experience. We will help you: + +* Install the Flutter framework +* Install the dependencies of the Flutter framework +* Create, run, and make changes to your first Flutter app +* Learn core Flutter concepts through a small step-wise lesson +* Suggest some next steps + +## Next step + +[Next step: Setup](/get-started/setup/) \ No newline at end of file diff --git a/get-started/setup-ios.md b/get-started/setup-ios.md new file mode 100644 index 0000000000..85e9557607 --- /dev/null +++ b/get-started/setup-ios.md @@ -0,0 +1,6 @@ +--- +layout: page +title: "Get Started: iOS Setup" +permalink: /get-started/setup-ios/ +--- + diff --git a/get-started/setup-path.md b/get-started/setup-path.md new file mode 100644 index 0000000000..7c3b566c3f --- /dev/null +++ b/get-started/setup-path.md @@ -0,0 +1,6 @@ +--- +layout: page +title: "Get Started: path setup" +permalink: /get-started/setup-path/ +--- + diff --git a/getting-started.md b/get-started/setup.md similarity index 95% rename from getting-started.md rename to get-started/setup.md index d0fff10f85..becb8157d8 100644 --- a/getting-started.md +++ b/get-started/setup.md @@ -1,11 +1,11 @@ --- layout: page -title: Getting Started with Flutter -permalink: /getting-started/ +title: "Get Started: Setup" +permalink: /get-started/setup/ --- -This page describes how to prepare your development environment to run Flutter -apps on Android. A [later step](todo) will detail how to run Flutter apps on iOS. +This page describes how to setup your development environment to run Flutter +apps on Android. A [later step](/get-started/setup-ios/) will detail how to run Flutter apps on iOS. ## 1: Select your preferences @@ -230,8 +230,10 @@ You should see the updated string in the running app almost immediately. -## Next steps +## Next step + +Now that you have the Flutter framework setup, let create a first project, +run it, and experiencee 'hot reload'. + +[Next step: Create and run your first app](/get-started/create-and-run/) -Now that you have your first Flutter app running, and have experienced 'hot -reload', let's learn some core Flutter concepts, and [extend the 'Hello from -Flutter'-app](/getting-started/app/) to a more complete app. \ No newline at end of file diff --git a/index.md b/index.md index dc67d6d222..d40831f295 100644 --- a/index.md +++ b/index.md @@ -21,7 +21,7 @@ hide_title: true
- Get Started + Get Started {% include note.html content="_Flutter is an alpha, open-source project_." %}
@@ -292,7 +292,7 @@ Future getBatteryLevel() async {
Try Flutter today. Getting started is easy.
- Get Started + Get Started {% include note.html content="_Flutter is an alpha, open-source project_." %}
From e59fa96bac0b6256bb7fb2f2885a9ad59d753f66 Mon Sep 17 00:00:00 2001 From: Michael Thomsen Date: Wed, 21 Feb 2018 16:04:13 +0100 Subject: [PATCH 06/31] A bit more refactoring --- _includes/get-started/android_device.md | 51 +++++++ _includes/get-started/install_flutter_sdk.md | 30 ++++ _includes/get-started/run-doctor.md | 29 ++++ get-started/create-and-run.md | 134 +++++++++++++++- get-started/setup.md | 153 +++---------------- 5 files changed, 268 insertions(+), 129 deletions(-) create mode 100644 _includes/get-started/android_device.md create mode 100644 _includes/get-started/install_flutter_sdk.md create mode 100644 _includes/get-started/run-doctor.md diff --git a/_includes/get-started/android_device.md b/_includes/get-started/android_device.md new file mode 100644 index 0000000000..8d10e18fba --- /dev/null +++ b/_includes/get-started/android_device.md @@ -0,0 +1,51 @@ +## Android setup + +### Install Android Studio + +To develop Flutter apps for Android, you can use a Mac, Windows, or Linux +(64-bit) machine. + +Flutter requires Android Studio to be installed and configured: + +1. Download and install [Android Studio](https://developer.android.com/studio/index.html). + +1. Start Android Studio, and go through the 'Android Studio Setup Wizard'. This +will install the latest Android SDK, Android SDK Platform-Tools, and Android SDK +Build-Tools, which are required by Flutter when developing for Android. + +### Set up your Android device + +To prepare to run and test your Flutter app on an Android device, you'll need an +Android device running Android 4.1 (API level 16) or higher. + +1. Enable **Developer options** and **USB debugging** on your device. Detailed instructions +are available in the [Android documentation](https://developer.android.com/studio/debug/dev-options.html). +3. Using a USB cable, plug your phone into your computer. If prompted on your +device, authorize your computer to access your device. +4. In the terminal, run the `flutter devices` command to verify that Flutter recognizes your +connected Android device. +5. Start your app by running `flutter run`. + +By default, Flutter uses the version of the Android SDK where your `adb` tool is based. If +you want Flutter to use a different installation of the Android SDK, you must set the +`ANDROID_HOME` environment variable to that installation directory. + +### Set up the Android emulator + +To prepare to run and test your Flutter app on the Android emulator, follow these steps: + +1. Enable [VM acceleration](https://developer.android.com/studio/run/emulator-acceleration.html) on your machine. +1. Launch **Android Studio>Tools>Android>AVD Manager** and select **Create Virtual Device**. +1. Choose a device definition and select **Next**. +1. Select one or more system images for the Android versions you want to emulate, + and select **Next**. An _x86_ or _x86\_64_ image is recommended. +1. Under Emulated Performance, select **Hardware - GLES 2.0** to enable +[hardware acceleration](https://developer.android.com/studio/run/emulator-acceleration.html). +1. Verify the AVD configuration is correct, and select **Finish**. + + For details on the above steps, see [Managing AVDs](https://developer.android.com/studio/run/managing-avds.html). +1. In Android Virtual Device Manager, click **Run** in the toolbar. + The emulator starts up and displays the default canvas for your selected OS version + and device. +1. Start your app by running `flutter run`. The connected device name is + `Android SDK built for `, where _platform_ is the chip family, such as x86. diff --git a/_includes/get-started/install_flutter_sdk.md b/_includes/get-started/install_flutter_sdk.md new file mode 100644 index 0000000000..53324e390b --- /dev/null +++ b/_includes/get-started/install_flutter_sdk.md @@ -0,0 +1,30 @@ +* Download the latest beta SDK from the [Flutter download page](todo). +* Install the downloaded SDK: +
    + + + +
+ +
+* In Windows Explorer, navigate to 'Downloads' +* Double click `flutter-sdk.zip` +* Click Extract +* Place the extracted files in your desired directory +
+
+```terminal +cd /users/Obiwan/development/ +unzip /users/Obiwan/downloads/flutter-sdk.zip +cd flutter +export PATH=`pwd`/flutter/bin:$PATH +``` +
+
+```terminal +cd /users/Obiwan/development/ +unzip /users/Obiwan/downloads/flutter-sdk.zip +cd flutter +export PATH=`pwd`/flutter/bin:$PATH +``` +
diff --git a/_includes/get-started/run-doctor.md b/_includes/get-started/run-doctor.md new file mode 100644 index 0000000000..706a16496b --- /dev/null +++ b/_includes/get-started/run-doctor.md @@ -0,0 +1,29 @@ +* Run Flutter Doctor to validate your setup: +
    + + + +
+ +
+* From the Start menu, open the Flutter Command Prompt +* Enter `flutter doctor`, and press return +* You should see + +
+
+```terminal +cd /users/Obiwan/development/ +unzip /users/Obiwan/downloads/flutter-sdk.zip +cd flutter +export PATH=`pwd`/flutter/bin:$PATH +``` +
+
+```terminal +cd /users/Obiwan/development/ +unzip /users/Obiwan/downloads/flutter-sdk.zip +cd flutter +export PATH=`pwd`/flutter/bin:$PATH +``` +
diff --git a/get-started/create-and-run.md b/get-started/create-and-run.md index aa87631e21..1c8be99698 100644 --- a/get-started/create-and-run.md +++ b/get-started/create-and-run.md @@ -4,7 +4,139 @@ title: "Get Started: Create and Run Your First App" permalink: /get-started/create-and-run/ --- -TODO +This page describes how to create your first Flutter app, run it, and learn +how to make changes with Hot Reload. + +Flutter is a flexible toolkit, so please start by selecting your development +tool of choice for writing, building, and running your Flutter app. + +
    + + + +
+ +
+ +*Android Studio:* A complete, integrated IDE experience for Flutter. + +## Create your first Flutter app + + 1. Select **File>New Flutter Project** + 1. Under **Flutter SDK path**, select **Install SDK...**, and enter the + location where you want to install the Flutter SDK + 1. Click **OK** + 1. Wait for Android Studio to install the SDK, and create the project. + +## Run the app + + 1. Locate the main Android Studio toolbar:
+ ![Main IntelliJ toolbar](/images/intellij/main-toolbar.png) + 1. In the **target selector**, select an Android device for running the app. + If none are listed as available, select **Tools>Android>AVD Manager** and + create one there. For details, see [Managing + AVDs](https://developer.android.com/studio/run/managing-avds.html). + 1. Click the **Run icon** in the toolbar, or invoke the menu item **Run > + Run**. + 1. If everything works, you should see your starter app on your device or + simulator:
+ ![Starter App on Android](/images/flutter-starter-app-android.png) + +## Try a hot reload + +Flutter offers a fast development cycle with _hot reload_, the ability to reload +the code of a live running app without restarting or losing app state. Simply +make a change to your source code, tell your IDE or command-line tool that you +want to hot reload, and see the change in your simulator, emulator, or device. + + 1. Change the string `'Hello from Flutter!'` to `'Hello from my app!'` + 1. Do not press the 'Stop' button; let your app continue to run. + 1. To see your changes invoke **Save All** (`cmd-s` / `ctrl-s`), or click the + **Hot Reload button** (the button with the lightning bolt icon). + +You should see the updated string in the running app almost immediately. + +
+ +
+ +*VS Code:* A light-weight editor with Flutter run and debug support. + +## Create your first Flutter app + + 1. TODO + +## Run the app + + 1. TODO + +## Try a hot reload + + 1. TODO + +
+ +
+ +*Terminal + editor:* Your editor-of-choice combined with Flutter's terminal tool +for running and building. + +## Create your first Flutter app + + 1. Use the `flutter create` command to create a new project: + {% commandline %} + cd /users/Obiwan/projects/ + flutter create hello_flutter + cd hello_flutter + {% endcommandline %} + +## Run the Flutter app + + 1. Check that an Android device is running. If none is shown, go back to step 2. + {% commandline %} + flutter devices + {% endcommandline %} + 1. Run the app with the `flutter run command`: + {% commandline %} + flutter run + {% endcommandline %} + + 1. If everything works, after the app has been built, you should see your + starter app on your device or simulator:
+ ![Starter App on Android](/images/flutter-starter-app-android.png) + +## Try a hot reload + +Flutter offers a fast development cycle with _hot reload_, the ability to reload +the code of a live running app without restarting or losing app state. Simply +make a change to your source code, tell your IDE or command-line tool that you +want to hot reload, and see the change in your simulator, emulator, or device. + + 1. Open the file `lib/main.dart` in your favorite Dart code editor + 1. Change the string `'Hello from Flutter!'` to `'Hello from my app!'` + 1. Do not press the 'Stop' button; let your app continue to run. + 1. To see your changes invoke **Save All** (`cmd-s` / `ctrl-s`), or click the + **Hot Reload button** (the button with the lightning bolt icon). + +You should see the updated string in the running app almost immediately. + +
    Current development OS: + + + +
+ +
+ +## Next step + +Now that you have the Flutter framework setup, let create a first project, +run it, and experiencee 'hot reload'. + +[Next step: Create and run your first app](/get-started/create-and-run/) + + + ## Next step diff --git a/get-started/setup.md b/get-started/setup.md index becb8157d8..5565639193 100644 --- a/get-started/setup.md +++ b/get-started/setup.md @@ -5,9 +5,9 @@ permalink: /get-started/setup/ --- This page describes how to setup your development environment to run Flutter -apps on Android. A [later step](/get-started/setup-ios/) will detail how to run Flutter apps on iOS. +apps on Android. -## 1: Select your preferences +A [later step](/get-started/setup-ios/) will detail how to run Flutter apps on iOS. Flutter is a flexible toolkit, so please start by selecting your development tool of choice for writing, building, and running your Flutter app. @@ -22,29 +22,29 @@ tool of choice for writing, building, and running your Flutter app. *Android Studio:* A complete, integrated IDE experience for Flutter. -## 2: Android Studio setup +## Install the Flutter SDK - +{% include /get-started/install_flutter_sdk.md %} + +## Android Studio setup -### 2a. Install Android Studio: +### Install Android Studio: * Download and install Android Studio 3.0 or later from the the [Android Studio site](https://developer.android.com/studio/index.html) -### 2b. Install the Flutter and Dart plugins: +### Install the Flutter and Dart plugins + +Flutter is supported by two plugins: * The `Flutter` plugin powers Flutter developer workflows (running, debugging, hot reload, etc.). * The `Dart` plugin offers code analysis (code validation as you type, code completions, etc.). -Installation steps: +To install these: - 1. Start IntelliJ IDEA or Android Studio. + 1. Start Android Studio. 1. Open plugin preferences (**Preferences>Plugins** on macOS, **File>Settings>Plugins** on Windows & Linux). 1. Select **Browse repositories…**, select the Flutter plug-in and click @@ -52,41 +52,9 @@ Installation steps: 1. Click `Yes` when prompted to install the Dart plugin. 1. Click `Restart` when prompted. -## 3: Installing the Flutter SDK, and creating your first Flutter app - - 1. Select **File>New Flutter Project** - 1. Under **Flutter SDK path**, select **Install SDK...**, and enter the - location where you want to install the Flutter SDK - 1. Click **OK** - 1. Wait for Android Studio to install the SDK, and create the project. - -## 4: Run the Flutter app +{% include /get-started/android_device.md %} - 1. Locate the main Android Studio toolbar:
- ![Main IntelliJ toolbar](/images/intellij/main-toolbar.png) - 1. In the **target selector**, select an Android device for running the app. - If none are listed as available, select **Tools>Android>AVD Manager** and - create one there. For details, see [Managing - AVDs](https://developer.android.com/studio/run/managing-avds.html). - 1. Click the **Run icon** in the toolbar, or invoke the menu item **Run > - Run**. - 1. If everything works, you should see your starter app on your device or - simulator:
- ![Starter App on Android](/images/flutter-starter-app-android.png) - -## 5: Try a hot reload - -Flutter offers a fast development cycle with _hot reload_, the ability to reload -the code of a live running app without restarting or losing app state. Simply -make a change to your source code, tell your IDE or command-line tool that you -want to hot reload, and see the change in your simulator, emulator, or device. - - 1. Change the string `'Hello from Flutter!'` to `'Hello from my app!'` - 1. Do not press the 'Stop' button; let your app continue to run. - 1. To see your changes invoke **Save All** (`cmd-s` / `ctrl-s`), or click the - **Hot Reload button** (the button with the lightning bolt icon). - -You should see the updated string in the running app almost immediately. +## Validate your setup with the flutter doctor @@ -94,7 +62,11 @@ You should see the updated string in the running app almost immediately. *VS Code:* A light-weight editor with Flutter run and debug support. -## 2: Android Studio setup +## Install the Flutter SDK + +{% include /get-started/install_flutter_sdk.md %} + +## Android Studio setup **TODO TODO TODO TODO TODO TODO TODO.** @@ -105,7 +77,11 @@ You should see the updated string in the running app almost immediately. *Terminal + editor:* Your editor-of-choice combined with Flutter's terminal tool for running and building. -## 2: Android Studio setup +## Install the Flutter SDK + +{% include /get-started/install_flutter_sdk.md %} + +## Android Studio setup