Flutter入门

Flutter 安装

推荐安装方式:下载 Github 上 Flutter 仓库,运行 bin 目录下的 flutter 脚本

flutter doctor

环境配置与安装依赖

Flutter 应用的编译调试,依赖 JDK、Andorid SDK 以及很多依赖包,需要安装 JDK 并配置相关环境变量。

即使准备用 VSCode 开发,也建议安装 Android Studio,因为安装过程会自动安装很多必需的依赖。

Flutter 文档

https://flutter.cn/

安装 Android Studio 插件

VSCode 中 Flutter 插件

Flutter 项目结构

可以使用 Flutter 插件创建新项目,也可以直接打开 flutter 仓库中的 examples 目录,里面内置了多个项目。

以 examples/api 为例

目录结构说明

一般项目只存在 android 和 ios 两个平台对应的目录

android 目录文件

ios 目录文件

Flutter 混合开发

Flutter 新建项目,本身就可以认为是混合开发的,项目中本身就包含了 android 平台和 ios 平台相关代码。

登录、消息推送等逻辑,也必须用原生代码写。

Flutter 提供了与原生通信的方法,也提供了 FlutterActivityFlutterViewController 给原生用于嵌入 Flutter 页面。

还可以将 Flutter 项目编译为模块,比如 Android 平台打包成 AAR 文件,嵌入到已有的原生代码仓库中,渐进式迁移。

Flutter 与平台通信

Flutter 架构概览

Flutter 架构概览

在每一个平台上,会包含一个特定的嵌入层,该嵌入层采用了适合当前平台的语言编写。

例如 Android 使用的是 Java 和 C++

iOS 和 macOS 使用的是 Objective-C 和 Objective-C++

Windows 和 Linux 使用的是 C++。

Skia

https://skia.org/

Skia 是谷歌开源的 2D 渲染引擎,用于 Chrome 浏览器,ChromeOS,Android 和 Flutter。

Skia 是比 OpenGL 和 Vulkan 更上层的 API。

由于 Flutter 在 Android 和 iOS 都使用 Skia 作为渲染引擎,可以保证界面渲染完全可控。

ReactNative 相比,不需要把 UI 的渲染交给原生系统。

Widget

Widget 类似 React 中的 Component,是 Flutter 应用界面的基础组成单位。每个 Widget 都提供 build 方法,类似 React 中的 render 方法。

flutter 源码内置了大量的 Widget 供使用,比如 Container、Row、Column、Text、Image、Router 等。

StatefulWidget 和 StatelessWidget

有状态组件和无状态组件,和 React 类似。使用 stfstl 可以快速输入代码片段

StatefulWidget

StatefulWidget 通过 setState 修改状态,一旦状态发生变化,就会触发 build 方法,重新构建界面。

Material 和 Cupertino

分别是 Android 风格和 iOS 风格的组件,提供了更多平台风格的、功能更多的 Widget。

Material 和 Cupertino UI 都是 flutter 源码中自带的,Material 是默认启用的。

import 'package:flutter/material.dart';

Material

Cupertino

通用布局

Flutter 中的布局与 Web 布局差异很大,子组件的布局收父组件的限制,并不是自己设置为多大就能有多大。

Flutter 路由导航

Flutter 通过 Navigator 实现路由导航,类似 React 中的 history,通过 Navigator.push 导航到新路由,Navigator.pop 返回。

Flutter 路由导航

类似 React 的 Switch Route 设置

package 和 plugin

插件 (plugin) 是 package 的一种,是特别的 package,特指那些有关获得原生平台特性的 package。

在 pubspec.yaml 中指定 package 支持的平台。

项目中包含 android 、ios 等平台的相关代码,用对应的 kotlin、swift 编写。

联合插件

将对不同平台的支持分为单独的软件包,然后用一个总包来联合

<
>