Flutter搭建开发环境

IntelliJ IDEA 2020.3.1 (Ultimate Edition)

jdk11

gradle-6.8.1

android-sdk

flutter

安装jdk

下载地址:https://www.oracle.com/java/technologies/javase-downloads.html

现在下载jdk需要注册账号,http://bugmenot.com/view/oracle.com 这个网址有提供账号

设置环境变量

JAVA_HOME=<安装目录>

PATH=%JAVA_HOME%\bin

1
java -version

安装gradle

下载地址:https://gradle.org/releases/

设置环境变量

PATH=D:\MySoft\JetBrains\gradle-6.8.1\bin

1
gradle -v

安装Flutter

下载地址:https://flutter.cn/docs/get-started/install/windows

设置环境变量

PATH=D:\MySoft\JetBrains\flutter\bin

安装IntelliJ IDEA

无线使用插件 https://gitee.com/pengzhile/ide-eval-resetter

安装flutter插件 File->Settings->Plugins

配置gradle File->Settings->Build, Execution, Deployment->Build Tools ->Gradle

Gradle user home: D:/MySoft/JetBrains/gradle-6.8.1

执行flutter docker Tools->Flutter->Flutter Doctor

android sdk File->Settings->Appearance & Behavior->System Settings->Android SDK

Android SDK Location: D:\MySoft\JetBrains\Android

修改镜像

修改Flutter项目下的android下的build.gradle

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
buildscript {
ext.kotlin_version = '1.3.50'
repositories {
//google()
//jcenter()
maven { url 'https://maven.aliyun.com/repository/google' }
maven { url 'https://maven.aliyun.com/repository/jcenter' }
maven { url 'http://maven.aliyun.com/nexus/content/groups/public' }
}

dependencies {
classpath 'com.android.tools.build:gradle:3.5.0'
classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
}
}

allprojects {
repositories {
//google()
//jcenter()
maven { url 'https://maven.aliyun.com/repository/google' }
maven { url 'https://maven.aliyun.com/repository/jcenter' }
maven { url 'http://maven.aliyun.com/nexus/content/groups/public' }
}
}
1
2
export PUB_HOSTED_URL=https://pub.flutter-io.cn
export FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn

问题

问题一:Manager AVDt升级提示

解决办法:JAVA由12调整为8

问题二:Some Android licenses not accepted. To resolve this, run: flutter doctor --android-licenses

解决办法:运行E:\App\flutterSDK\flutter>flutter doctor --android-licenses,全部回答y

问题三: No devices available

解决办法:flutter config --android-sdk E:\App\AndroidSDK(本机android sdk路径)

其他

https://flutter.cn/community/china

镜像1:https://maven.aliyun.com/mvn/guide

镜像2:https://mirrors.tuna.tsinghua.edu.cn/help/flutter/

使用阿里云国内镜像

对单个项目生效,在项目中的build.gradle修改内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
buildscript {
repositories {
maven { url 'https://maven.aliyun.com/repository/google/' }
maven { url 'https://maven.aliyun.com/repository/jcenter/'}
}
dependencies {
classpath 'com.android.tools.build:gradle:2.2.3'

// NOTE: Do not place your application dependencies here; they belong
// in the individual module build.gradle files
}
}

allprojects {
repositories {
maven { url 'https://maven.aliyun.com/repository/google/' }
maven { url 'https://maven.aliyun.com/repository/jcenter/'}
}
}

对所有项目生效,在${USER_HOME}/.gradle/下创建init.gradle文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
allprojects{
repositories {
def ALIYUN_REPOSITORY_URL = 'https://maven.aliyun.com/repository/public/'
def ALIYUN_JCENTER_URL = 'https://maven.aliyun.com/repository/jcenter/'
def ALIYUN_GOOGLE_URL = 'https://maven.aliyun.com/repository/google/'
def ALIYUN_GRADLE_PLUGIN_URL = 'https://maven.aliyun.com/repository/gradle-plugin/'
all { ArtifactRepository repo ->
if(repo instanceof MavenArtifactRepository){
def url = repo.url.toString()
if (url.startsWith('https://repo1.maven.org/maven2/')) {
project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_REPOSITORY_URL."
remove repo
}
if (url.startsWith('https://jcenter.bintray.com/')) {
project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_JCENTER_URL."
remove repo
}
if (url.startsWith('https://dl.google.com/dl/android/maven2/')) {
project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_GOOGLE_URL."
remove repo
}
if (url.startsWith('https://plugins.gradle.org/m2/')) {
project.logger.lifecycle "Repository ${repo.url} replaced by $ALIYUN_GRADLE_PLUGIN_URL."
remove repo
}
}
}
maven { url ALIYUN_REPOSITORY_URL }
maven { url ALIYUN_JCENTER_URL }
maven { url ALIYUN_GOOGLE_URL }
maven { url ALIYUN_GRADLE_PLUGIN_URL }
}
}

验证是否修改成功

在 build.gradle 文件内增加一个任务

1
2
3
4
5
6
7
task showRepos {
doLast {
repositories.each {
println "repository: ${it.name} ('${it.url}')"
}
}
}

然后执行 gradle -q showRepos 任务,如果输出了刚刚配置的地址就说明修改成功,如下:

1
2
$ gradle -q showRepos
repository: maven ('http://maven.aliyun.com/nexus/content/groups/public')

代码签名

要将应用发布到 Apple store 或者 Goople play 上就必须对你的应用进行代码签名,代码签名目的是为了识别谁开发了该应用程序,并确保该应用程序的所有更新均来自这个人。

Andorid

对于 Android 来说有两种签名:发布签名和上传签名。最终用户下载的 .aab/.apk 文件使用发布签名。上传签名提供给开发者上传到 Google Play 商店的认证。上传后,Google Play 会重新使用发布签名对 .aab/.apk 文件签名。

  1. 使用 Android Studio 为您的应用签名
  2. 使用命令行工具进行签名 为 app 签名

iOS

  1. Apple Developer Account console 创建并下载一个分发证书。
  2. 打开 ios/Runner.xcworkspace 在你的项目设置里选择一个分发证书。

官方文档

Flutter 的安卓打包

Flutter 在打包安卓应用时有两种方式 flutter build apkflutter build appbundle,本文说下这两种方式有什么区别。

Appbundle

Android App Bundle 是上传到 Google Play 用以支持 Dynamic Delivery 的文件,扩展名为 .aab,一个 bundle 包含所有应用的已编译代码和资源,但是还没有生成 apk 和 Google Play 的签名。

Google Play 的新应用服务模式称为 Dynamic Delivery(动态传送),使用你的应用包为每个用户的设备配置生成并提供优化的 APK,因此用户只下载运行应用所需的代码和资源。开发者不再需要构建,签名和管理多个 APK 来支持不同的设备,用户可以获得更小,更优化的下载。

官方文档

Apk

如果应用不发布到 Google Play,则需要发布多个 apk,但必须自己构建,签名和管理每个 apk。

通常构建一个 apk 用以支持所有目标设备,但由于需要支持多个屏幕密度或应用程序二进制接口(ABI)的文件,这可能会导致非常大的 apk,减少 apk 大小的一种方法是创建多个 apk,在执行 flutter build apk 的时候可以添加构建参数 --target-platform android-arm,android-arm64 --split-per-abi, 这样构建出来的 apk 包含特定屏幕密度或 ABI 的文件。

官方文档

Visual Studio Code

安装插件

Chinese (Simplified) Language Pack for Visual Studio Code

Dart

Flutter

Flutter tree

Pubspec Assist

Flutter Widget Snippets

Awesome Flutter Snippets

Code Runder 鼠标右键菜单运行

Bracket Pair Colorizer 2

Flutter Files

GitLens

fish-redux-template

IntelliJ IDEA Keybindings

Path Intellisense

Setting Sync

VSCode Great Icons

vscode-flutter-i18n-json

通过Android Studio或者IntelliJ IDEA创建虚拟机,安装第三方模拟器,也可以使用真机来调试

创建项目: flutter create test

启动项目:flutter run 就可以在模拟器中打开项目

ctrl + shift + a 打开命令面板,输入 flutter