【Dart】什么是 Mixins?
Dart 中提供 mixin 来完成 代码的复用,比如我们可以将某种行为封装成一个 mixin,然后添加到需要该项行为的类中。但是似乎抽象类/接口也能完成,它们面向的场景还是有些许差别的。 因为已经有非常棒的文章解释 mixin,这里就偷个懒直接丢原文链接了。 Dart: What are mixins? 通读这篇文章,理解 mixin 也就没什么困难了。。。
【Flutter】Widget、Element、RenderObject 理解
使用 Flutter 开发时,接触最多的就是 Widget,但是 Widget 并不会最终显示在屏幕上。Flutter 大量借鉴 React ,React 中有 Component、Virtual DOM 和 tag,Flutter 中对应地有 Widget、Element 以及 RenderObject,所以这篇文章就简单理解下这三者在视图渲染中的作用。 Widget先看看源码注释: 12Describes the configuration for an [Element].Widgets are the central class hierarchy in the Flutter framework. A widget is an immutable description of part of a user interface. Widgets can be inflated into elements, which manage the underlying render tree. 大概的意思就是 Widget 只是起到配置的作用的,并且是 imutable 的, ...
【Flutter】BLoC——Flutter 中的 MVP
写过 Android 的应该都会比较熟悉 MVP 模式,在 Flutter 框架下有着相似的 BLoC(Business Logic Component) 模式,不准确地说,BLoC 就是 MVP 在 Flutter 中的变种。 StatelessWidget vs StatefulWidget在正式开始讲 BLoC 前,先在此回顾下 Widget。 Widget 在 Flutter 整个绘制过程中,只充当配置的角色,基本不会涉及到的绘制相关的 API,所以在应用运行过程中时刻有大量的 Widget 产生并销毁。但是很多情况下,我们并不想 Widget 的某些状态/数据也一并销毁,比如输入框中已经输入的文本,这时候就有了 Widget 的两个子类——StatelessWidget 和 StatefulWidget。 所以如果我们想要保存一些状态或者实例变量的话,就需要使用 StatefulWidget。 Stream & Sink在 这篇文章 中已经学习了如何通过 async* 和 yield 来创建一个 Stream,这种方式我们只能对 Stream 下游进行 ...
[概念理解] 并行VS并发、同步VS异步、阻塞VS非阻塞
之前老是遇到并行并发、同步异步、阻塞非阻塞等概念的困扰,特别是在学 Nginx 的时候,异步非阻塞,迷。。。。 并发并行理解它们之间的区别,知道有单核多核 CPU 就差不多了。 对于 并发 ,在只有一个 CPU 资源时,系统处理多任务的方式是以时间片轮转的方式来执行任务,也即任务轮流获得 CPU 资源进而被执行,同一时刻只有一个任务被执行。 而当拥有多个 CPU 资源时,多任务会被分配给不同的 CPU 单元,也即同一时刻会有多个任务 并行 执行。 同步异步同步异步的概念是从 消息传递方式 的角度来定义的。 在代码中比较典型的体现如下: 12345678int ret = calculateSync();calculateAsync(new Callback(){ @Override public void onRet(int ret){ }}); 所以在这里,前者就是同步的调用,后者是异步的。 前者在调用之后,直到拿到结果才返回;后者在调用后立即返回,结果通过回调的方式回传。当然,异步的回传结果的方式不止这一种,除了 ...
[Android 踩坑] 明文传输
昨天晚上 Glide 加载图片突然出现: 1Exception: IOException java.io.IOException: Cleartext HTTP traffic to * not permitted 明确指出不允许明文传输,测试机器是 Android P 的模拟器。 这个问题是 Android P 在安全方面的一个变更,所以也是坑了一大波人,即 SO 上有答案。 解决办法去年开始 Google 和 Apple 都在 HTTPS 方面加紧推进,但是并没有强制,只是在一些方面设一些小坑。Android P 之前明文传输还是默认支持的,但是在 Android P 及更高的版本上明文传输默认被禁止,所以如果不加配置就运行在 Android P 设备上就会出现异常。 方案一方案一比较简单,AndroidManifest.xml 添加 一行 配置就行了: 12345678<?xml version="1.0" encoding="utf-8"?><manifest ...> ... <applic ...
【Flutter】 Dart 面向对象
Dart 是一门纯粹的面向对象的语言,即任何变量或实例都是 Object 的实例。同时 Dart 不支持多继承,但是支持 Mixin 特性,即一个类的定义在 不被继承 的情况被其它类复用。 在 Dart 2.X 中,new 关键字可以省略 运行时类型很多时候都需要获取某个实例的类型,可以通过访问实例的 runtimeType 变量获取变量类型(Type): 123456789main(List<String> args) { var str = "this is a String"; print(str.runtimeType); print(str.runtimeType.runtimeType);}/** * String * _Type */ Type 是一个抽象类, _Type 应该是它的具体实现了 实例变量下面是实例变量的声明方式: 123class Point{ [final] var value [ = 233];} 实例变量可以手动设置默认值,如果没有设置则默认 ...
【Flutter】Dart 事件循环
基于 Dart VM version: 2.1.0-dev.4.0.flutter-4eb879133a (Tue Sep 18 19:20:33 2018 +0000) on “macos_x64” Dart 和 JS 类似,也是单线程的设计,所以内部存在一个事件循环。 基于单线程,我们可以得出这样的结论:Dart 的函数一旦执行,便不会被打断,直到函数执行完成才会执行其他 Dart 代码。 事件循环和队列和 Android 的消息机制非常类似,会有一个消息队列,然后有一个循环♻️不断的从队列里面取消息进行处理/执行。 Dart 中事件循环实现Dart 事件循环实现了两条队列:event queue、microtask queue 。 event queue:包含所有外部的事件,包含不局限于I/O、鼠标、绘制、isolate 消息传递,这些消息产生于 Dart 代码或者系统,例如使用 Future。 microtask queue:这个队列的作用类似 Android 的 sendMessageAtFront 方法,也即该队列的事件总是会被优先处理,但是 ...
【Flutter】Dart 异步编程
基于 Dart VM version: 2.1.0-dev.4.0.flutter-4eb879133a (Tue Sep 18 19:20:33 2018 +0000) on “macos_x64” Dart 基础库提供了大量返回值类型为 Future 和 Stream 的函数,这些函数都是异步函数,当调用这些函数的时候,函数在完成一些“基础配置“后就会立马返回,而不是等待函数执行完成。 Future在 JS 世界里,有 Promise ,Dart 中相应实现为 Future 。在语意上,Future 表示将来某个时间开始并完成的事情的结果,这和 Promise 含义相近。 下面是一个简单🌰: 12345678910111213main(List<String> args) { new Future(() { return "success"; }).then((s) { print(s); }); print("main");}/** * ...
【Flutter】Dart 函数
基于 Dart VM version: 2.1.0-dev.4.0.flutter-4eb879133a (Tue Sep 18 19:20:33 2018 +0000) on “macos_x64” 函数在 Dart 中有专门的 Function 对应,也就是说定义一个函数其实是定义了一个变量,而这个变量类型是 Function ,需要执行这个函数时就和普通的函数调用一样。 当然这个变量不可写 函数定义函数定义的一般形式是这样的: 123[type] funname([type] p0, [[type] pn], [[type] pp0 [= 'default'] [, [type] pp1]]){ [return expr]} 或者这样的: 123[type] funname([type] p0, [[type] pn], [{type] pp0 [= 'default'] [, [type] pp1}]){ [return expr]} 前者表示有 可选 ...
创建带参的 ViewModel 实例
Android Jet Pack 的 ViewModel 为开发者在处理配置变更时数据保存带来了一定便捷性,但是如果定义的 ViewModel 子类构造器有参数,那么还要提供一个对应的 ViewModelProvider.Factory 实现。 那么问题来了,这都是一些样板代码,枯燥无意义,所以更加优雅的方式还是通过工具自动创建。 工具实现不废话了,直接上代码: 1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162public class VMFactory { private static final Map<String, Constructor<?>> cacheMap = new WeakHashMap<>(); public static <T extends ViewModel> T viewModel(Fragment f ...