肥言肥语

肥肥鱼胡说八道的地方

0%

本文主要是对 Flutter 的基本框架进行介绍。本文主要参考了 美团技术团队-Flutter 原理与实践 一文。美团技术团队-Flutter 原理与实践 是一篇非常优秀的介绍 Flutter 原理的文章。

Flutter 的设计目标是高性能的跨平台的(AndroidiOSUI 框架。与传统的基于 WebView 的(例如 Cordova 或者 AppCan 等框架)或者基于原生控件系统的(例如 React Native)跨平台开发框架所不同的是,Flutter 是基于跨平台的渲染引擎 Skia 来实现的全新的跨平台的开发框架。这也就是说,Flutter 对于设备平台的依赖只有图形渲染相关的部分,这在一定程度上保证了不同平台、不同设备上的一致的用户体验。从执行效率的角度来说,Flutter 使用的 Dart 语言相较于其他大多数跨平台开发框架使用的 JavaScript 语言在执行效率上高效很多。

阅读全文 »

本文主要介绍 Flutter 异步编程相关的内容。关键字 asyncasync*syncsync*awaityield 以及 FutureStreamTimer 对象构成了 Flutter 异步编程的全部内容。

Future 是一个泛型对象,表示程序在将来的某个时刻能够获取到一个值,泛型类型表示了该返回值的类型。当返回值是 Future 的方法被调用之后,FlutterDart)将会做两件事情:

  • 将需要执行的的任务添加到异步队列中,并返回一个未完成的 Future 对象
  • 如果任务的运行结果有效(包括异常信息),Future 以该值完成任务的执行。如果需要使用 Future 中的值,可以使用如下两种方式:
    • 使用 asyncawait 关键字
    • 使用 Future API

Stream 也是一个泛型对象,表示异步数据的流通管道。它只允许从一端插入数据并通过管道从另外一端流出数据。为了控制 Stream,我们通常使用 StreamControllerStream 进行管理:

  • StreamController 提供了类型为 StreamSinksink 属性作为数据的入口
  • StreamController 提供了 stream 属性作为数据的出口

Dart 1.9 中引入了函数生成器的概念,利用惰性方法计算结果序列,以提升性能。生成器有两种类型:

  • 同步生成器:在需要的时候才生成值,然后使用者从生成器中拉取。使用 sync* 表示
  • 异步生成器:会以它自身的速度生成值,然后推送到使用者可以使用的地方。使用 async* 表示

Timer 提供了一种使用计时器的异步任务的执行方式,

阅读全文 »

本文主要介绍 Flutter 插件开发的相关内容,并在 path_provider/path_provider.dart 插件项目的基础上开发我们自己的 flutter_file_path_provide 插件。

本文中涉及到的主要技术是基于 Flutter 开发(07):编写平台相关的代码。当然,在我们的 flutter_file_path_provide 插件项目中只使用到了 MethodChannel。另外两种平台通道我们将在其他文章中介绍。

由于肥肥从事 Android SDK 开发,所以 flutter_file_path_provide 插件项目中的 iOS 部分在本文撰写时并没有实现。

阅读全文 »

前面文章介绍的 path_provider.dart 库和 shared_preferences.dart 库的实际上是依赖于设备的具体环境的。比如说在 shared_preferences.dart 库在存储数据时,在 Android 设备上使用的是 SharedPreference 相关的功能,而在 iOS 上则是使用了 NSUserDefaults 的相关功能。换句话说,这些代码都是平台相关的。

本文主要介绍 Flutter 中平台相关的代码的开发,其目的是快速了解 AndroidiOS 原生代码与 Flutter 之间的通信。

本文将以 Flutter 的官方 path_provider/path_provider.dart 库作为示例。

平台通道的作用是在 Flutter 和设备之间传递消息,如下所示:

flutter-platform-channel

Flutter 中平台特定的 API 支持并不依赖于代码生成,而是依赖于灵活的消息传递方式:

  • 应用程序的 Flutter 部分通过平台通道(Platform Channel)将消息发送到该应用程序的设备平台(AndroidiOS
  • 设备平台通过对平台通道的监听接收到消息之后,调用设备平台上对应的 API(使用设备平台原生开发语言),然后将响应数据发送回应用程序的 Flutter 部分

本文中有大量的内容参考自阿里咸鱼技术团队的 深入理解 Flutter Platform Channel 一文。该文章对 Flutter 的平台通道有非常详细的讲解。

再次表达对咸鱼团队的感谢以及对肥肥作为伸手党的不齿。

阅读全文 »

本文主要介绍 FlutterSharedPreference 的使用,其目的是介绍 shared_preferences.dart 库的使用。shared_preferences.dart 官方开源的轻量级数据存储库,并且屏蔽了 AndroidiOS 平台上使用 K-V 型数据的差异。

使用 shared_preferences.dart 前需要添加配置并更新依赖:

1
shared_preferences: ^0.5.1+1

然后,在需要使用该库的地方引入该库:

1
import 'package:shared_preferences/shared_preferences.dart';
阅读全文 »

本文主要介绍 FlutterAndroidiOS 两个平台下文件存储位置,主要目的是掌握 Flutter 官方开源项目 path_provider/path_provider.dart 的使用。

使用 path_provider.dart 库之前,需要先在 pubspec.yaml 文件的 dependencies: 中添加如下依赖:

1
path_provider: ^0.5.0+1

然后在项目的根目录中使用如下命令更新依赖:

1
flutter packages get

最后,在项目中需要使用的地方引入该库:

1
import 'package:path_provider/path_provider.dart';

使用 path_provider.dart

path_provider.dart 库屏蔽了 AndroidiOS 两个平台上文件存储路径的差异。path_provider.dart 库主要提供了如下几个方法用于获取存储路径:

  • getTemporaryDirectory():获取临时文件夹,针对于 Android 设备 getCacheDir()iOS 设备 NSTemporaryDirectory() 返回的值
  • getApplicationDocumentsDirectory():获取 Document 文件夹,针对 Android 设备的 AppDate 目录,iOS 设备的 NSDocumentDirectory 目录
  • getExternalStorageDirectory(): 获取存储卡目录,只有 Android 设备可用

本文主要介绍 Flutter 中针对文件的操作,主要目的是掌握使用 dart:io 库相关方法操作文件。

本文是基于 Dart V2.1.0Flutter V1.0.0 版本进行的介绍。

Flutter 操作文件的类主要涉及到:

  • Directory:用于操作文件目录
  • File: 用于操作文件
  • Stream:用于接收数据流(dart:async 库)

如果要使用 dart:io 库,我们需要在使用的位置导入:

1
import 'dart:io';

如果需要使用到 Stream,那么还需要导入:

1
import 'dart:async';
阅读全文 »

本文主要介绍 Flutter 项目中的 Http 网络请求。本文介绍的重点是,Flutterdart:io 库中的 HttpClient 的使用,以及开源 Flutter 网络请求库 package:http/http.dart 的使用。

本文介绍的所有特性是基于 Flutter V1.0.0 以及 Dart V2.1.0

由于 dart:io 库对于 POST 请求支持不好,本文中只简单介绍了使用 dart:io 库发起 GET 请求的情况。http/http.dart 库我们也只介绍 GET 请求和 POST 请求的使用,对于其他类型的情况,可参考官方文档。

dio/dio.dart 库也是非常优秀的 Http 请求库,如果对其感兴趣,请移步项目地址:dio/dio.dart

阅读全文 »

本文主要介绍 Dart 语言中常用的库,并不做详细介绍,只作为索引的目的。

本文中介绍的 Dart 语言特性是基于 Dart 2.1.0

Dart 中的库可以分为如下三种类型:

  • 核心库
    • dart:dart:async:支持异步编程的库,包含 FutureStream 等类
    • dart:collection:用于补充 dart:core 中各类集合框架的库
    • dart:convert:支持数据类型转换、编码格式转换的库
    • dart:coreDart 内置库,包括常用的数据类型以及核心的定义
    • dart:developer:支持开发调试的库,包含调试程序和检测程序
    • dart:math:支持数学运算的库,包含数学常数、运算以及随机数生成器
    • dart:typed_data:用于处理固定大小的数据(例如无符号8字节整数)和 SIND 类型的数据
  • Web 相关的库
    • dart:html:用于处理浏览器和 DOM 交互的库
    • dart:indexed_db:支持基于的索引的 k-v 的数据库
    • dart:js:用于支持 JavaScript 的库
    • dart:js_util:支持 JavaScript 工具库
    • dart:svg:支持 SVG 渲染的库
    • dart:web_audio:支持音频开发的库
    • dart:web_gl:支持 Web GL 渲染的库
    • dart:web_sql:支持用于在浏览器存储可以使用 SQL 查询的数据的 API
  • 虚拟机相关的库
    • dart:cli:用于暂停堆栈、运行微服务、处理传入时间的库
    • dart:io:用于在非 Web 应用中支持文件、SocketHttp 以及其他 I/O 的库
    • dart:isolate:用于支持协程的库
    • dart:mirrors:用于支持反射的库

本人中只对核心库和虚拟机相关的库做简单介绍。

阅读全文 »