Kotlin Android中使用Intent获取Double/Int数据遇默认值参数错误
解决Intent获取Double/Int数据时的"No value passed for parameter 'defaultValue'"错误
问题根源
getStringExtra(key)仅需传入key参数,因为它返回可空类型String?,当找不到对应key时会返回nullgetDoubleExtra和getIntExtra必须传入第二个默认值参数——这两个方法返回的是非空基本类型(Double/Int),无法用null表示数据不存在的情况,所以必须提供默认值兜底
另外你的代码存在隐藏问题:传递price和image时传入的是字符串(比如"price"),但获取时用的是对应数值类型的方法,类型不匹配会导致即使解决默认值问题,也拿不到正确数据。
修复方案
1. 修正数据获取逻辑(ProductActivity中)
给getDoubleExtra和getIntExtra补充默认值,同时注意获取逻辑应该写在接收数据的ProductActivity中,而非MainActivity:
class ProductActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // 获取Intent传递的数据 val title = intent.getStringExtra(KEY_TITLE) // 返回String?,无需默认值 val price = intent.getDoubleExtra(KEY_PRICE, 0.0) // 传入默认值0.0 val imageResId = intent.getIntExtra(KEY_IMAGE, 0) // 传入默认值0 val category = intent.getStringExtra(KEY_CATEGORY) } companion object { const val KEY_TITLE = "title" const val KEY_PRICE = "price" const val KEY_IMAGE = "image" const val KEY_CATEGORY = "category" } }
2. 修正数据传递逻辑(MainActivity中)
传递price和image时,要传入对应数值类型的数据,而非字符串:
class MainActivity : ComponentActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) // ...其他初始化逻辑 } private fun startProductActivity(productItem: ProductItem) { val intent = Intent(this, ProductActivity::class.java) intent.putExtra(ProductActivity.KEY_TITLE, productItem.title) // 传入String类型 intent.putExtra(ProductActivity.KEY_PRICE, productItem.price) // 传入Double类型,如19.99 intent.putExtra(ProductActivity.KEY_IMAGE, productItem.imageResId) // 传入Int类型,如R.drawable.product_photo intent.putExtra(ProductActivity.KEY_CATEGORY, productItem.category) // 传入String类型 startActivity(intent) } }
可选:获取可空的数值类型
如果需要判断数据是否存在(而非直接用默认值),可以结合hasExtra方法:
val price: Double? = if (intent.hasExtra(KEY_PRICE)) { intent.getDoubleExtra(KEY_PRICE, 0.0) } else { null }
内容的提问来源于stack exchange,提问作者M Baig
相关产品推荐
相关产品推荐

