Flutter:一个移动应用开发框架,它使用 Dart、C++、Skia 开发,对外提供了彻底不依赖系统平台的 Widget 的能力,只经过自绘图形的方式工做,具备极其优秀的跨平台性。目前已经支持了 iOS、Android、Fuchsia。web
macOS 下,安卓模拟器的进程名为:sdkqemu-system-i386,可在任务管理器强行关闭。编程
若是提示:Please configure Android SDK,须要将 ANDROID_HOME 环境变量设置为相应的 SDK 安装目录app
构建UI界面的逻辑在build方法中框架
Scaffold
是Material库中提供的页面脚手架,它包含导航栏和Body以及FloatingActionButton(若是须要的话)异步
路由(Route)在Android中一般指一个Activity,在iOS中指一个ViewController。ide
在原生开发中,Android使用Gradle来管理依赖,iOS用Cocoapods或Carthage来管理依赖。
而 Flutter 使用配置文件 pubspec.yaml(位于项目根目录)来管理第三方依赖包。布局
在构建期间,Flutter将asset放置到称为 asset bundle 的特殊存档中,应用程序能够在运行时读取它们(但不能修改)。测试
声明分辨率相关的图片 assets:
AssetImage 能够将asset的请求逻辑映射到最接近当前设备像素比例(dpi)的asset。为了使这种映射起做用,必须根据特定的目录结构来保存asset。字体
注意,AssetImage 并不是是一个widget, 它其实是一个ImageProvider,有些时候你可能指望直接获得一个显示图片的widget,那么你可使用Image.asset()方法。ui
要加载依赖包中的图像,必须给AssetImage提供package参数。
例如,假设您的应用程序依赖于一个名为“my_icons”的包,它具备以下目录结构:
…/pubspec.yaml …/icons/heart.png …/icons/1.5x/heart.png …/icons/2.0x/heart.png …etc.
而后加载图像,使用:
new AssetImage('icons/heart.png', package: 'my_icons')
或
new Image.asset('icons/heart.png', package: 'my_icons')
注意:包在使用自己的资源时也应该加上package参数来获取。
Dart分析器大量使用了代码中的类型注释来帮助追踪问题。咱们鼓励您在任何地方使用它们(避免var、无类型的参数、无类型的列表文字等),由于这是追踪问题的最快的方式。
可使用 debugger()
语句插入编程式断点。要使用这个,你必须添加 import 'dart:developer';
到相关文件顶部;debugger()语句采用一个可选when参数。
微任务一般来源于Dart内部,而且微任务很是少。
值得注意的是,咱们能够经过Future.microtask(…)方法向微任务队列插入一个任务。
在事件循环中,当某个任务发生异常并无被捕获时,程序并不会退出,而直接致使的结果是当前任务的后续代码就不会被执行了,也就是说一个任务中的异常是不会影响其它任务执行的。
Flutter 中真正表明屏幕上显示元素的类是 Element,Widget 只是 Element 的配置数据。而且一个Widget能够对应多个Element。
Key: 这个key属性相似于React/Vue中的key,主要的做用是决定是否在下一次build时复用旧的widget,决定的条件在canUpdate()方法中。
Flutter提供了一套丰富、强大的基础widget,在基础widget库之上Flutter又提供了一套Material风格(Android默认的视觉风格)和一套Cupertino风格(iOS视觉风格)的widget库。要使用基础widget库,须要先导入:
import 'package:flutter/widgets.dart';
因为Material和Cupertino都是在基础widget库之上的,因此若是你的应用中引入了这二者之一,则不须要再引入flutter/widgets.dart了,由于它们内部已经引入过了。
在Flutter中使用字体分两步完成。首先在pubspec.yaml中声明它们,以确保它们会打包到应用程序中。而后经过TextStyle属性使用字体。
按钮:有一个onPressed属性来设置点击回调,当按钮按下时会执行该回调,若是不提供该回调则按钮会处于禁用状态,禁用状态不响应用户点击。
使用自定义字体图标:在Flutter中,使用iconfont.cn上ttf格式的字体文件便可
容器的大小能够经过width、height属性来指定,也能够经过constraints来指定,若是同时存在时,width、height优先。实际上Container内部会根据width、height来生成一个constraints。
Material Design 设计规范中有些是不能自定义的,如导航栏高度,ThemeData只包含了可自定义部分。
若是不想让某个子树响应PointerEvent的话,咱们可使用IgnorePointer和AbsorbPointer,这两个Widget都能阻止子树接收指针事件,不一样之处在于AbsorbPointer自己会参与命中测试,而IgnorePointer自己不会参与,这就意味着AbsorbPointer自己是能够接收指针事件的(但其子树不行),而IgnorePointer不能够。
GestureDetector内部是使用一个或多个GestureRecognizer来识别各类手势的,而GestureRecognizer的做用就是经过Listener来将原始指针事件转换为语义手势,GestureDetector直接能够接收一个子Widget。GestureRecognizer是一个抽象类,一种手势的识别器对应一个GestureRecognizer的子类。
在Flutter中自定义Widget有三种方式:经过组合其它Widget、自绘和实现RenderObject。
自绘:Flutter中提供了CustomPaint和Canvas供咱们自绘UI外观。
际上Flutter提供的全部Widget最终都是调用Canvas绘制出来的。
经过HttpClient设置的header,对整个httpClient都生效;而经过HttpClientRequest设置的header,只对当前请求生效。
与Future返回单个异步响应不一样,Stream类能够随着时间推移传递不少事件。
运行flutter build apk
后,打包文件的路径:build/app/outputs/apk/release/app-release.apk