配置完成后,咱们打开 AVD Manager,点击“Create Virtual Device”按钮建立一台 Nexus 6P 模拟器,至此 Android Studio 的安装配置工做就完成了。前端
配置完成后,咱们打开 Terminal,输入命令open -a Simulator打开 iOS 模拟器,检查 Hardware>Device 菜单项中的设置,并试着在不一样的模拟器之间作切换。ios
配置Flutter环境变量git
进入Flutter工程目录 输入flutter emulator命令,会显示当前可用的模拟器算法
flutter emulators --launch apple_ios_simulator (启动模拟器)
flutter run (运行项目)
复制代码
Flutter 提供了一个命令flutter doctor协助咱们安装 Flutter 的工程依赖,它会检查本地是否有 Android 和 iOS 的开发环境,若是检测到依赖缺失,就会给出对应依赖的安装方法。浏览器
遇到的坑bash
mac环境还可能提示CocoaPods相关错误,如CocoaPods has installed but not initialized,提示你使用执行命令pod setup。可是执行后会发现,过程很是缓慢,基本以失败了结。并发
cd ~/.cocoapods/repos
git clone https://mirrors.tuna.tsinghua.edu.cn/git/CocoaPods/Specs.git master
或 git clone https://gitclub.cn/CocoaPods/Specs.git master
复制代码
Dart 是少数同时支持 JIT(Just In Time,即时编译)和 AOT(Ahead of Time,运行前编译)的语言之一。app
JIT 和 AOT 则是最多见的两种编译模式。框架
在开发期使用 JIT 编译,能够缩短产品的开发周期。函数
而在发布期使用 AOT,就不须要像 React Native 那样在跨平台 JavaScript 代码和原生 Android、iOS 代码之间创建低效的方法调用映射关系。
Dart VM 的内存分配策略比较简单,建立对象时只须要在堆上移动指针,内存增加始终是线性的,省去了查找可用内存的过程。
在 Dart 中,并发是经过 Isolate 实现的。Isolate 是相似于线程但不共享内存,独立运行的 worker。这样的机制,就可让 Dart 实现无锁的快速分配。
Dart 的垃圾回收,则是采用了多生代算法。新生代在回收内存时采用“半空间”机制,触发垃圾回收时,Dart 会将当前半空间中的“活跃”对象拷贝到备用空间,而后总体释放当前空间的全部内存。回收过程当中,Dart 只须要操做少许的“活跃”对象,没有引用的大量“死亡”对象则被忽略,这样的回收机制很适合 Flutter 框架中大量 Widget 销毁重建的场景。
支持并发执行线程的高级语言(好比,C++、Java、Objective-C),大都以抢占式的方式切换线程,即:每一个线程都会被分配一个固定的时间片来执行,超过了时间片后线程上下文将被抢占后切换。若是这时正在更新线程间的共享资源,抢占后就可能致使数据不一样步的问题。
解决这一问题的典型方法是,使用锁来保护共享资源,但锁自己又可能会带来性能损耗,甚至出现死锁等更严重的问题。
这时,Dart 是单线程模型的优点就体现出来了,由于它自然不存在资源竞争和状态同步的问题。这就意味着,一旦某个函数开始执行,就将执行到这个函数结束,而不会被其余 Dart 代码打断。因此,Dart 中并无线程,只有 Isolate(隔离区)。Isolates 之间不会共享内存,就像几个运行在不一样进程中的 worker,经过事件循环(Event Looper)在事件队列(Event Queue)上传递消息通讯。
在 Flutter 中,界面布局直接经过 Dart 编码来定义。Flutter 并不须要相似 JSX 或 XML 的声明式布局语言。
跨平台开发方案的三个时代
根据实现方式的不一样,业内常见的观点是将主流的跨平台方案划分为三个时代。
Flutter 则开辟了一种全新的思路,即从头至尾重写一套跨平台的 UI 框架,包括渲染逻辑,甚至是开发语言。
渲染引擎依靠跨平台的 Skia 图形库来实现,Skia 引擎会将使用 Dart 构建的抽象的视图结构数据加工成 GPU 数据,交由 OpenGL 最终提供给 GPU 渲染,至此完成渲染闭环,所以能够在最大程度上保证一款应用在不一样平台、不一样设备上的体验一致性。
而开发语言选用的是同时支持 JIT(Just-in-Time,即时编译)和 AOT(Ahead-of-Time,预编译)的 Dart,不只保证了开发效率,更提高了执行效率(比使用 JavaScript 开发的泛 Web 容器方案要高得多)。