首页
学习
活动
专区
工具
TVP
发布

利用 Kotlin 的特性,让 Intent 传递数据的方式更优雅!

承香墨影

只分享最有用的原创技术干货!

关注

在 Android 开发中,使用 Intent 在不同的页面之间,传递数据,是一个常用的操作。

本文中,利用了 Kotlin 的扩展和委托,让这个操作变得更加易用和简单,思路很有意思,和 Google 前段时间发布的Kotlin KTX有点像,利用这样的思路,你也可以扩展出很多系统 Api 不支持的功能。

— 承香墨影

作者 | Limo Saplf

原文 |

文本遵循 CC BY-NC-SA 3.0 协议,授权转载

这篇文章来源于 You won't believe this one weird trick to handle Android Intent extras with Kotlin ,本来准备翻译一遍,但是担心理解不够深入,索性按着自己的理解整理一遍。十分感谢 @Eugenio Marletti 的思路。

首先,这篇文章可能会涉及到的知识点有:

伴生对象

对象表达式与对象声明

扩展函数

扩展属性

高阶函数( 表达式)

带接收者的函数字面值

委托属性

Java 的实现方式

在 Android 开发中, 之间的数据传递是不可避免的。初次接触 Android 编程的时候,许多教程会写出这样的代码:

这样写当然没有错,的确达到了传递数据的目的,但是,这却会让代码难以维护。稍微有些开发经验的,都会选择将 信息的键值抽出变为常量,并且把许多类似的键值放在同一个地方,避免出现键值的冲突。

为了更好的可读性,还有一些人会这样去封装 :

这样一来,读写 的确如读写类成员属性一般了,可是,不得不说,这也极大地增加了代码的编写量。当然,或者可以通过注解、动态生成代码的方式来解决这一问题,但这不是本篇文章的解决方案。

Kotlin 的登场

在 Java 的实现方式中,最适合阅读、最符合面向对象思想的数据传递方式当属最后一种,那,下面就用一些 Kotlin 的特性来实现:

可以看到,利用 Kotlin 提供的扩展函数的特性,我们就可以在 对象上直接使用 了,这是 Java 语言做不到的。

需要注意的是 表达式的使用,这涉及到扩展函数的作用域问题。在 Kotlin 中,扩展函数的作用范围只在其定义范围内。一般而言,我们把许多扩展函数定义在了顶级作用域中,这样在整个 App ,被扩展的对象实例都可以使用该函数。但是考虑到,我们不能在 对象上无限制地添加 ,所以利用 ,让这些扩展函数只在该对象的作用域内有效。在实际使用中,这个 可以是某个 的伴生对象。

到这里,我们可以更进一步,使用扩展属性,让赋值/取值的过程更符合 Kotlin 的语言规范:

嗯,不论写那个 的过程怎样,至少,在使用这样的 方面,体验到了读写原生对象的便利啊。

Kotlin 中的委托

委托?为什么要用委托?上面的代码我们使用委托的模式改写一下:

可以看到,委托就是把 内容的读写操作抽取出来,以便复用。进行了这样的抽取之后,我们又可以在 Kotlin 的语言特性中找到这样的实现:

啊哈,这样一来,相当于仅仅是对 内的变量进行了一下声明,就可以在对应的范围内使用了!而存储的键值,也完全可以省略,直接使用字段名:

一般而言,在 可以这样使用:

以上,就是使用 Kotlin 优化 数据传输的基本思路。当然,在这个思路下,还有许多可以封装的,比如,自定义类型数据的传输——可以去看一看原作者的开源库android-extras-delegates

android-extras-delegates:

https://github.com/Takhion/android-extras-delegates

  • 发表于:
  • 原文链接http://kuaibao.qq.com/s/20180313B1FEZW00?refer=cp_1026
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券