kotlin getSerializableExtra已过时,有什么替代方法?

jjjwad0x  于 2022-11-16  发布在  Kotlin
关注(0)|答案(6)|浏览(1790)

我已将targetSdkVersioncompileSdkVersion升级到**33
现在收到警告getSerializableExtragetParcelableExtra已过时。
我检查并确认from here已被弃用。
建议使用
updated**getSerializableExtragetParcelableExtra,任何人都可以帮助我使用更新的方法。
1.获取**Object**时出现警告:

1.获取**ListArrayList**时出现警告:

n3ipq98p

n3ipq98p1#

这就是我所使用的:

inline fun <reified T : Serializable> Bundle.serializable(key: String): T? = when {
  Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU -> getSerializable(key, T::class.java)
  else -> @Suppress("DEPRECATION") getSerializable(key) as? T
}

inline fun <reified T : Serializable> Intent.serializable(key: String): T? = when {
  Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU -> getSerializableExtra(key, T::class.java)
  else -> @Suppress("DEPRECATION") getSerializableExtra(key) as? T
}

我在这里也为getParcelable编写了相同的代码,并请求将其添加到Support libraries directly

vyu0f0g1

vyu0f0g12#

方法T getSerializableExtra(String, Class<T>)是从android 33引入的。所以你应该为使用android 33以下的设备使用if块。

fun <T : Serializable?> getSerializable(activity: Activity, name: String, clazz: Class<T>): T
{
    return if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU)
               activity.intent.getSerializableExtra(name, clazz)!!
           else
               activity.intent.getSerializableExtra(name) as T
}

然后您可以在您活动中使用它,如下所示:

val myPOJOClass = getSerializable(this, "my_intent_key", MyPOJOClass::class.java)
oxcyiej7

oxcyiej73#

但是,Mohamad Seyedi's回答完成了这项工作。但是,在从**onActivityResult()获取intent数据的情况下,它失败了。
我们无法在
onActivityResult()**内使用Activity的Intent获取数据。以下是我得到的解决方案。

解决方案1:使用分机功能:

fun <T : Serializable?> Intent.getSerializable(key: String, m_class: Class<T>): T {
    return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU)
        this.getSerializableExtra(key, m_class)!!
    else
        this.getSerializableExtra(key) as T
}

用法:

val myPOJOClass = intent.getSerializable("my_intent_key", MyPOJOClass::class.java)

解决方案2:使用常规函数:

fun <T : Serializable?> getSerializable(intent: Intent, key: String, m_class: Class<T>): T {
    return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU)
        intent.getSerializableExtra(key, m_class)!!
    else
        intent.getSerializableExtra(key) as T
}

用法:

val myPOJOClass = getSerializable(intent, "my_intent_key", MyPOJOClass::class.java)
4uqofj5v

4uqofj5v4#

我自己还没有用过,因为文档说更新的方法是
T getSerializableExtra(String, Class<T>)所以我想你可以如下使用它。

val myPOJOClass = intent.getSerializableExtra("my_intent_key", MyPOJOClass::class.java)
kr98yfug

kr98yfug5#

受穆罕默德答案的启发,你可以做一个延伸

fun <T : Serializable?> Bundle.getSerializableCompat(key: String, clazz: Class<T>): T {
    return if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) getSerializable(key, clazz)!! else (getSerializable(key) as T)
}

并在任何地方都这样称呼它:

arguments?.getSerializableCompat("my_key", MyClass::class.java)
ux6nzvsh

ux6nzvsh6#

val myPojoClass = getSerializable(intent, "key_name_here", MyPojoTypeClass::class.java)

然后,创建函数

private fun <T : Serializable?> getSerializable(intent: Intent, key: String, className: Class<T>): T {
        return if (Build.VERSION.SDK_INT >= 33)
            intent.getSerializableExtra(key, className)!!
        else
            intent.getSerializableExtra(key) as T
    }

相关问题