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参数:
- 先自定义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) } }
- 在导航图的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
相关产品推荐
相关产品推荐

