使用
组件CachedNetworkImage可以支持直接使用或者通过ImageProvider
。
引入依赖
1 | dependencies: |
执行flutter pub get
,项目中使用
Import it
1 | import 'package:cached_network_image/cached_network_image.dart'; |
添加占位图
1 | CachedNetworkImage( |
进度条展示
1 | CachedNetworkImage( |
select * from learn
组件CachedNetworkImage可以支持直接使用或者通过ImageProvider
。
引入依赖
1 | dependencies: |
执行flutter pub get
,项目中使用
Import it
1 | import 'package:cached_network_image/cached_network_image.dart'; |
添加占位图
1 | CachedNetworkImage( |
进度条展示
1 | CachedNetworkImage( |
然而在这样一个信息过载的时代里,形形色色的声音与观点鱼龙混杂。生活在信息洪流中的我们,应该如何避免随波逐流,做到真正的独立思考?
或许可以了解一下“CriticalThinking”——「批判性思维」。
批判性思维是以一种合理的、反思的、心灵开放的方式进行思考,从而能够清晰准确地表达、逻辑严谨地推理、合理地论证,以及培养思辨精神。
在批判性思维的情感倾向方面,科南特(J.Kurland)于1995年提出:批判性思维与过分情感主义、智力懒惰和封闭思维相反,它关注证据、智力、诚实和开放思维。因此批判性思维强调依靠证据而非情感,全面考虑各种可能的观点和解释,警惕个人动机和偏见的影响,更关注寻求真理,不拒绝非流行的观点,意识到自己的偏见、歧视,自觉避免或减少这些偏见对判断的影响。此外,具有批判性思维并不意味着总是对任何人和任何事持否定态度和吹毛求疵,批判精神意味着敏锐的思维、好奇的探究、对推理的热情、对可靠信息的渴望。
Flutter 2.5 是 Flutter 版本历史上排名第二的大版本更新,该版本:
回顾过去一年,可以看到有 1337 位 contributors 创建了 21,072 个 PR 这样庞大的数据,其中有15,172 个被合并。
事实上该版本依然是对性能和开发工具进行了改进,同时还有增加许多新功能,包括:
随着移动行业全球化,Google Play 也陆续加入各种不同的付款方式,让用户可以选择喜好的付款方式。请注意,Google Play 帐号的国家/地区设置会影响能选择的付款方式。
如果要更改国家/地区,您需要在 Google Play 中设置一个新的国家/地区。要设置新的国家/地区,用户必须位于相应国家/地区,并且在新的国家/地区有受支持的付款方式。
请注意:
以下列举 Google Play 中部分采用中文语言的国家/地区常用的付款方式:
早期的Android上App的启动速度常为人诟病,如今的启动表现已不逊iOS。Google针对系统的不断优化绝对功不可没,从8.0独立出来的
SplashWindow
,到12上推出的全新SplashScreen
。
在App的主要内容展示之前,按照需求的不同,或多或少会先展示这样几个画面。
画面 | 用途 |
---|---|
Splash Screen | 展示品牌Logo或Slogan |
Advertisement Screen | 展示节日活动或日常广告 |
Guide Screen | 演示重点功能,一般只展示一次 |
自从谷歌 I/O 2017宣布将支持 Kotlin 作为 Android 开发的 First-Class 语言,相信各位程序员的朋友圈都被Kotlin的消息轰炸了吧,支持Java的“守旧派”认为Java将稳坐霸主地位不动摇,支持Kotlin的“维新派”认为Kotlin很可能会把Java拉下马。其实,笔者认为新语言的出现对于程序员来说并不是一件新鲜事儿,程序员始终践行着“活到老,学到老”,真正能够对程序员产生影响的新语言的使用和性能。
工程项目都是需要指定开发规范的。比如变量命名等。在java中,方法重载的时候会生成@Override注解,但是这并不是强制约束的。kotlin的方法采用override关键字进行了强制约束。
再比如TODO。java中的TODO是以注释的形式存在,即使没有实现TODO处的代码,也没什么运行时问题。kotlin的TODO形式如下:
1 | fun main(args: Array<String>) { |
kotlin TODO的实现
1 | @kotlin.internal.InlineOnly |
可以看到运行时会抛出异常。
思考:这里为什么不在编译期抛出异常呢?
java中虽然有@Nullable @NotNull等注解。但是不会在编译期起作用,而是在运行期抛出异常。kotlin在声明变量的时候,可以指定变量是否为空,调用可为空对象时,需要进行空判断。
java在jvm的协助下虽然也是跨平台语言,但是不能像kotlin一样可以既可以编译成class字节码,又可以编译成js。
只有全量编译下,kotlin比java慢。增量编译下,两者几乎没有差距。
懒加载、高阶函数、协程、inline操作符、运算符重载、默认参数等。
GitHub 用户amitshekhariitbhu在GitHub上贴图分享了Java和Kotlin的语法区别,下面我们就一起来看一下吧!
Branch 实现Android端 deferred deep link
官网sdk文档地址:https://docs.branch.io/apps/android/
1. Configure Branch(配置Branch)
ViewModel
类旨在以注重生命周期的方式存储和管理界面相关的数据。ViewModel类让数据可在发生屏幕旋转等配置更改后继续存在。
Android 框架可以管理界面控制器(如 Activity 和 Fragment)的生命周期。Android 框架可能会决定销毁或重新创建界面控制器,以响应完全不受您控制的某些用户操作或设备事件。
如果系统销毁或重新创建界面控制器,则存储在其中的任何临时性界面相关数据都会丢失。例如,应用的某个 Activity 中可能包含用户列表。因配置更改而重新创建 Activity 后,新 Activity 必须重新提取用户列表。对于简单的数据,Activity 可以使用 onSaveInstanceState()
方法从 onCreate()
中的捆绑包恢复其数据,但此方法仅适合可以序列化再反序列化的少量数据,而不适合数量可能较大的数据,如用户列表或位图。
另一个问题是,界面控制器经常需要进行异步调用,这些调用可能需要一些时间才能返回结果。界面控制器需要管理这些调用,并确保系统在其销毁后清理这些调用以避免潜在的内存泄露。此项管理需要大量的维护工作,并且在因配置更改而重新创建对象的情况下,会造成资源的浪费,因为对象可能需要重新发出已经发出过的调用。
诸如 Activity 和 Fragment 之类的界面控制器主要用于显示界面数据、对用户操作做出响应或处理操作系统通信(如权限请求)。如果要求界面控制器也负责从数据库或网络加载数据,那么会使类越发膨胀。为界面控制器分配过多的责任可能会导致单个类尝试自己处理应用的所有工作,而不是将工作委托给其他类。以这种方式为界面控制器分配过多的责任也会大大增加测试的难度。
从界面控制器逻辑中分离出视图数据所有权的做法更易行且更高效。