美文网首页
使用kotlin扩展Intent传值

使用kotlin扩展Intent传值

作者: AhSea | 来源:发表于2018-03-22 11:08 被阅读0次

    本文章是建立在
    利用 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;
        }
    }
    

    相关文章

      网友评论

          本文标题:使用kotlin扩展Intent传值

          本文链接:https://www.haomeiwen.com/subject/fimpqftx.html