可空接收器类型捆绑的不安全使用? android 应用程序将在编译时出现警告但立即崩溃

Posted

技术标签:

【中文标题】可空接收器类型捆绑的不安全使用? android 应用程序将在编译时出现警告但立即崩溃【英文标题】:Unsafe use of a nullable receiver type Bundle? android app will compile with warning but instantly crashes 【发布时间】:2019-10-01 08:09:26 【问题描述】:

我是 kotlin 和 android 编程的新手,而且似乎这种语言在没有一些落后功能的情况下发展得相当快。

这是我在 MainActivity.kt 中的两个主要函数

override fun onCreate(savedInstanceState: Bundle?) 
    super.onCreate(savedInstanceState)
    setContentView(R.layout.activity_main)

    cameraButton.setOnClickListener 
        val callCameraIntent = Intent(MediaStore.ACTION_IMAGE_CAPTURE)
        if(callCameraIntent.resolveActivity(packageManager) != null) 
            startActivityForResult(callCameraIntent, CAMERA_REQUEST_CODE)
        
    

    replaceFragment(ReportsFragment())
    bottom_navigation.setOnNavigationItemSelectedListener(mOnNavigationItemSelectedListener)




override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) 
    super.onActivityResult(requestCode, resultCode, data)

    val dt: Intent? = data

    when(requestCode) 
        CAMERA_REQUEST_CODE -> 
            if(resultCode == Activity.RESULT_OK && data != null) 
            //if(data != null) 
                //&& data != null)
                photoImageView.setImageBitmap(data.extras.get("data") as Bitmap)
            
        
        else -> 
            Toast.makeText(this, "Unrecognized request code", Toast.LENGTH_SHORT).show()
        
    

错误似乎出现在 onActivityResult 的“WHEN”块中。

我已将数据(正在传递的意图)包装在 null 检查中,尝试将其声明为具有 null 检查的新值,但在编译时它不断收到相同的警告:

不安全地使用 Bundle 类型的可空接收器?

它还一直说这个折旧的警告: 此版本中使用了已弃用的 Gradle 功能,使其与 Gradle 6.0 不兼容。

我已将 gradle 版本切换到 5.1.1,并且 android Gradle 插件目前为 3.4.0(其中任何一个都可能是我的问题的一部分)

【问题讨论】:

【参考方案1】:

data.extras 可能为 null,因此请确保将其与 ?.as? 一起使用:

photoImageView.setImageBitmap(data?.extras?.get("data") as? Bitmap)

所有三个都确保如果datadata.extras"data" 为空或不是Bitmap,则链本身为空。

已弃用的 Gradle 功能通常是关于已弃用 API 的警告。只要确保将所有插件更新为最新的,只要您需要不适应新 API 的插件,就不要更新到 Gradle 6。但目前它只是警告您相关的变化。

【讨论】:

以上是关于可空接收器类型捆绑的不安全使用? android 应用程序将在编译时出现警告但立即崩溃的主要内容,如果未能解决你的问题,请参考以下文章

Kotlin空安全 ② ( 手动空安全管理 | 空安全调用操作符 ? | let 函数结合空安全调用操作符使用 )

▩Dart-深入理解空安全

Kotlin空安全 ③ ( 手动空安全管理 | 非空断言操作符 !! | 使用 if 语句判空 )

kotlin 注释处理器中的可空类型

来自 pendingintent 的 Android 捆绑包始终接收为 null

严格验证可空字段[重复]