You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android desugaring下safe args传java.time.LocalDate低版本崩溃问题

问题根源

崩溃是因为低版本系统中Navigation组件解析导航图参数时,内部直接调用Class.forName("java.time.LocalDate")加载类,但Java 8+ API desugaring对java.time类的实现逻辑是:API < 26时会将代码中引用的java.time.LocalDate自动替换为desugar库提供的兼容类,不会在classpath中保留原生java.time.LocalDate类,因此反射加载直接失败。

解决方案

方案1:升级Navigation组件版本(优先推荐)

Navigation 2.4.0-alpha01及更高版本已经原生适配了desugared的java.time类型,直接升级你的androidx.navigation:navigation-*系列依赖到2.4.0或以上稳定版本即可直接兼容低版本系统,不需要修改原有导航图配置。

方案2:自定义LocalDate类型的NavType(不适合升级版本时使用)

如果项目限制不能升级Navigation版本,可以自定义NavType来解析LocalDate参数:

  1. 先自定义LocalDateNavType类:
import android.os.Bundle
import androidx.navigation.NavType
import java.time.LocalDate

class LocalDateNavType : NavType<LocalDate?>(true) {
    override fun put(bundle: Bundle, key: String, value: LocalDate?) {
        bundle.putSerializable(key, value)
    }

    override fun get(bundle: Bundle, key: String): LocalDate? {
        return bundle.getSerializable(key) as? LocalDate
    }

    override fun parseValue(value: String): LocalDate {
        return LocalDate.parse(value)
    }
}
  1. 在导航图的argument配置中替换argType为你自定义的类全路径:
<argument
    android:name="lastTime"
    android:defaultValue="@null"
    app:argType="com.yourpackage.LocalDateNavType"
    app:nullable="true" />

注意将com.yourpackage.LocalDateNavType替换为你自己项目中该类的实际全类名。

方案3:参数类型替换(临时兼容方案)

如果不想修改自定义类型,可以将参数类型改为String或Long,传递LocalDate时转成ISO格式字符串/毫秒时间戳,接收后再转回LocalDate即可。

内容的提问来源于stack exchange,提问作者Alex

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 09:45:00