使用kotlin扩展Intent传值

本文章是建立在
利用 Kotlin 的特性,让 Intent 传递数据的方式更优雅
基础上进行调整的,你需要先了解此文章的相关内容再看本文

根据利用 Kotlin 的特性,让 Intent 传递数据的方式更优雅
最后使用的结果就为

class Activity : AppCompatActivity() {
  companion object IntentOptions {
    var Intent.id by IntentExtraString()
    var Intent.name by IntentExtraString()
    var Intent.message by IntentExtraString()
  }

  fun test(intent: Intent) {
    intent.id = "1"
    intent.name = "pass"
    intent.message = "message"
  }
}

fun testOutSide(intent: Intent) = with(Activity.IntentOptions) {
  val id = intent.id
  val name = intent.name
  val message = intent.message
}

但此需要定义后每一个Activity对应都需要扩展一次参数,个人嫌太麻烦
便把Intent扩展放到底层BaseActivity中,但这样就变得麻烦,id扩展只能为String,但有可能为Int.这样就没办法扩展,于是定义一个Any的委托

class IntentExtra(private val key: String? = null) {
    private val KProperty<*>.extraName: String
        get() = this@IntentExtra.key ?: name

    operator fun getValue(intent: Intent, property: KProperty<*>): Any? =
            intent.extras?.get(property.extraName)


    operator fun setValue(intent: Intent, property: KProperty<*>, any: Any?) {
        //简单添加几个常用类型,可以扩展添加其他类型
        when (any) {
            is String ->
                intent.putExtra(property.extraName, any)
            is Int ->
                intent.putExtra(property.extraName, any)
            is Boolean ->
                intent.putExtra(property.extraName, any)
            is Parcelable ->
                intent.putExtra(property.extraName, any)
            is Serializable ->
                intent.putExtra(property.extraName, any)


        }
    }
}

主要注意在 intent.putExtra无法传入Any.则在setValue中做了类型判断.这里先做几个简单的类型,自己可根据情况扩展

定义好几个常用参数,这些扩展参数在自己项目中基本够用了,同时定义Any类型,这样也可以减少创建的大量的扩展变量

(定义的这些扩展变量其实也可以设置顶级作用域中,这样更方便取值,但不确定这种方式会不会有其他影响,并未设置,如果有清楚的小伙伴可以告诉我)

var Intent.id by IntentExtra()
var Intent.value by IntentExtra()
var Intent.status by IntentExtra()
var Intent.url by IntentExtra()
var Intent.type by IntentExtra()
var Intent.module by IntentExtra()

最后在使用时只要在不同activity中取值转换好对应传入值类型

class OneActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_one)
        val id = intent.id as String;
    }
}

class TwoActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_one)
        val id = intent.id as Int;
    }
}
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容