kotlin 委托(使用kotlin扩展Intent传值)

本文目录
- 使用kotlin扩展Intent传值
- Kotlin laterinit 与 by lazy
- Kotlin lateinit 和 by lazy
- Android kotlin 委托获取 intent 参数
- lateinit by lazy
使用kotlin扩展Intent传值
本文章是建立在
利用 Kotlin 的特性,让 Intent 传递数据的方式更优雅
基础上进行调整的,你需要先了解此文章的相关内容再看本文
根据 利用 Kotlin 的特性,让 Intent 传递数据的方式更优雅
最后使用的结果就为
但此需要定义后每一个Activity对应都需要扩展一次参数,个人嫌太麻烦
便把Intent扩展放到底层BaseActivity中,但这样就变得麻烦,id扩展只能为String,但有可能为Int.这样就没办法扩展,于是定义一个Any的委托
主要注意在 intent.putExtra无法传入Any.则在setValue中做了类型判断.这里先做几个简单的类型,自己可根据情况扩展
定义好几个常用参数,这些扩展参数在自己项目中基本够用了,同时定义Any类型,这样也可以减少创建的大量的扩展变量
(定义的这些扩展变量其实也可以设置顶级作用域中,这样更方便取值,但不确定这种方式会不会有其他影响,并未设置,如果有清楚的小伙伴可以告诉我)
最后在使用时只要在不同activity中取值转换好对应传入值类型
Kotlin laterinit 与 by lazy
laterinit 与by lazy 是Kotlin中两种不同延迟初始化的实现。
laterinit 只用于变量var by lazy 只用于常量val
lazy()方法只是接受一个lambda并返回一个Lazy《T》 实例的函数,返回的实例可以作为实现延迟属性的委托:第一次调用get()会执行已传递给lazy()的lambda表达式并记录结果,后续调用get()只是返回记录的结果。
lazy()方法常用于只获取不赋值并且多次使用的对象。
laterinit则用于只能生命周期流程中进行获取或者初始化的变量
laterinit 不能用于可空的属性上和java的基本类型上:(Int、Long等)
laterint 可以在任何位置初始化,并且可以初始化多次。而by lazy只初始化一次
Kotlin lateinit 和 by lazy
1、lateinit 和 lazy 是 Kotlin 中的两种不同的延迟初始化的实现
2、lateinit 只用于变量 var,而 lazy 只用于常量 val
lazy()是接受一个 lambda 并返回一个 Lazy 《T》 实例的函数,返回的实例可以作为实现延迟属性的委托: 第一次调用 get() 会执行已传递给 lazy() 的 lambda 表达式并记录结果, 后续调用 get() 只是返回记录的结果。
比如这样的常见操作,只获取,不赋值,并且多次使用的对象
再比如acitivity中控件初始化的操作,一般传统的进入界面就初始化所有的控件,而使用懒加载,只有用到时才会对控件初始化
注意:
1、lazy 只能用在val类型 修饰不可变的常量,lateinit 只能用在var类型 修饰变量
注意:hashMap和list 在第一次使用的时候初始化。
Android kotlin 委托获取 intent 参数
通过 Kotlin 中的两个接口:ReadOnlyProperty 和 ReadWriteProperty,可以方便的实现属性委托或局部委托。对于 val 变量使用 ReadOnlyProperty,而 var 变量实现ReadWriteProperty。
这里通过 kotlin 实现委托获取界面跳转时 intent 传递的数据:
使用姿势:
就这么简单。
lateinit by lazy
Kotlin中延迟初始化的方法:
lateinit , by lazy
lateinit用在var变量,作用:编译器检查时不因为变量未初始化而报错。
private lateinit var mRootView: View
然后在inflateView之后再对变量进行赋值,使用的时候默认非空
by lazy 属性委托, 用在val常量(相当于java 中final变量):
private val a: Int by lazy { 5 }
虽然两者都可以推迟属性初始化的时间,但是lateinit var只是让编译期忽略对属性未初始化的检查,后续在哪里以及何时初始化还需要开发者自己决定。
而by lazy真正做到了声明的同时也指定了延迟初始化时的行为,在属性被第一次被使用的时候才自动初始化,且保证了线程安全。
初始化时 默认的线程执行模式:
LazyThreadSafetyMode.SYNCHRONIZED:-
锁用于确保只有一个线程可以初始化Lazy实例。
LazyThreadSafetyMode.PUBLICATION:-
并发访问未初始化的Lazy实例值时,可以多次调用
Initializer函数,但是只有第一个返回的值将用作Lazy实例的值。
LazyThreadSafetyMode.NONE:-
不使用锁来同步对Lazy实例值的访问。如果从多个线程访问该实例,则其行为是不确定的。除非保证永不从多个线程初始化Lazy实例,否则不应使用此模式。

更多文章:
array push back(如图,Plane是一个类,v_array.push_back(fly)是啥意思)
2025年8月4日 17:45
sqlserver if语句(sql语句中if判断条件怎么写)
2025年7月19日 21:15
matlab产生随机数(用matlab生成0到100之间的一组随机数)
2025年10月20日 02:45
域名停靠app大全免费下载网站(十大免费软件app下载网站)
2025年10月8日 20:00
windows net user(windows无法启动update位于本地计算机错误5)
2025年6月25日 13:30
pycharm怎么返回上一步操作(pycharm如何打开回退上一步按钮)
2026年7月20日 06:45
assistant拆分记忆(求救!黑莓8700怎么取消被记忆的设置)
2025年9月4日 04:15
select语句有什么用(SQL select语句除了用于查询外还有哪些其他用途)
2026年1月29日 16:00
webservice接口难吗(webservice接口测试问题)
2025年6月25日 05:30











