Android 未进行依赖管理导致的问题:IDE 报错 “Unresolved reference: registerForActivityResult“但是能正常编译运行

2023-05-16

前言

谷歌前段时间废弃了 startActicityForResult 取而代之的是 ActicityResultApi ,作为一个紧跟谷歌步伐走的菜鸟开发者,当然想着的是第一时间学习并替换项目中的相关代码。

但是,奇怪的是,IDE 没有警告 startActicityForResult 已废弃,只是在编译时会警告该方法已废弃。

虽然不知道为什么,但是我还是自己手动找到了所有使用了 startActicityForResult 的地方,并且更改为 ActicityResultApi

然而,IDE 却爆红了,提示 Unresolved reference: registerForActivityResult

请添加图片描述

我一开始怀疑是我写错了,但是我尝试着编译运行了一下,却没有出错,也能够正常运行。

排查过程

问题的根本原因

作为一名面向搜索引擎编程的菜鸡,想到的第一件事当然是先谷歌一下看看咯。

在 stackoverflow 上,大多数人指出出现这个问题是因为 AndroidX 的 activity 依赖版本过低,尚不支持该方法,但是我很确信我的依赖版本已经是最新版本了。

接着往下搜索,发现了有人说可以通过强制转换类型来解决:

private val requestPermission = (this as ComponentActivity).registerForActivityResult(ActivityResultContracts.RequestPermission()) { isGranted ->

}

显然,这样只是治标不治本。所以继续搜索。

在谷歌的 issuetracker 上找到两条这样的 issue:
Superclass resolution fails with 2 versions of the library in the project
、Bug: unable to find registerForActivityResult on large project despite having the needed dependencies

上面的 issue 大致是说,如果依赖同一个库有不同的版本,那么 IDE 可能会解析到错误的库版本,导致某些新版本中的 API 无法被 IDE 解析到。

总而言之,这是 IDEA 的一个 BUG 被 Android Studio “继承” 了过来。

那么,这个问题就无法解决,只能等官方修复了吗?

非也,既然知道了导致 BUG 的原因,我们当然是要去避免触发这个 BUG 了。

触发问题的诱因

首先查看一下项目依赖:

请添加图片描述

很显然可以看到,项目确实同时依赖了两个 acticity 库,其中一个为 1.0.0 版本(无 ActicityResultApi),另外一个为 1.5.0 版本(有 ActicityResultApi),而我很确信,我在主模块(app)中依赖的是 1.5.0 版本,但是 IDE 解析时却解析的是 1.0.0 版本。

找到了问题确实存在,下一步则是找出是哪个模块或者哪个第三方库引用了 1.0.0 版本的 acticity。

依次点击 Adnroid Stuidio 的菜单 File - Project Structure - Dependencies 打开依赖树分析窗口。

然后在 All Modules 中 选中 activity:1.0.0 查看依赖路径:

请添加图片描述

从依赖路径中能明显看到,1.0.0 版本的 activity 是被 imageEdit 模块的 appcompat 依赖引入的。

我们看一下 iamgeEdit 模块的 build.gradle 模块:

dependencies {
	......

    implementation 'androidx.appcompat:appcompat:1.1.0'
    ......
}

确实发现该模块依赖了 appcompat 库。

注:我之所以言之凿凿的说 activity 是被 appcompat 引入的而非如图中所示的第一级依赖明明是 fragment ,是因为 fragment 其实也是被 appcompat 引入,因为这两个库是相互依赖的关系。并且我的依赖中也只写了 appcompat ,并未添加 fragment ,所以才得出如上结论。

解决方法与思考

解决方法

知道了诱发错误的原因后,更改起来就很简单了,只需要把 iamgeEdit 模块的 appcompat 库等级改为最新版本或支持 ActicityResultApi 的适合自己项目的版本即可。

这里我将 appcompat 更新到最新版本后可以看到错误已消失:

请添加图片描述

思考

虽然问题已经解决了,但是我们不应该止步于见招拆招,而应该有更多的思考:为什么会出现依赖冲突?

由于这个项目最开始是单模块项目,后来越写越大,才逐渐拆分出其他子模块,所以压根没有做依赖管理。

一个健康的项目,应该有一个统一的依赖管理,而不是随心所欲的各个模块胡乱添加依赖。

在此推荐大佬写的文章:

【Gradle7.0】依赖统一管理的全新方式,了解一下~

文章中也有其他依赖管理方式的链接,大伙可以根据自己的项目需求自行选择。

该文章首发于我的博客:likehide.com

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Android 未进行依赖管理导致的问题:IDE 报错 “Unresolved reference: registerForActivityResult“但是能正常编译运行 的相关文章

  • rabbit-mq 本地环境搭建

    一 xff1a 安装RabbitMQ需要先安装Erlang语言开发包 xff0c 直接下载地址 xff1a http erlang org download otp win64 18 3 exe 尽量安装时不选择C盘 xff0c 避免操作系
  • oracle小数点前面没有0,纠结解惑

    一1 天前台人找到我 xff0c 说我们安装的数据库有问题 xff0c 为什么小数点前面是0就不显示呢 xff0c 我去看了一下 xff0c command窗口要显示 SQL gt create table ml test num numb
  • 网监后台管理系统设计思路

    本次做的是网监系统saas服务平台的后台管理系统 xff0c 不涉及复杂功能逻辑 就是从菜单 模板 系 统 组织架构 角色 用户的设计思路 产品需求 xff1a 在各个省市网监系统的数量不断增长 xff0c 且系统逻辑和功能模块大致相同 x
  • 分类算法 c4.5 详解

    C4 5是一系列用在机器学习和数据挖掘的分类问题中的算法 它的目标是监督学习 xff1a 给定一个数据集 xff0c 其中的每一个元组都能用一组属性值来描述 xff0c 每一个元组属于一个互斥的类别中的某一类 C4 5的目标是通过学习 xf
  • 正则表达式匹配Html代码中图片路劲

    正则表达匹配图片路径 public static string GetHtmlImageUrlList string sHtmlText 定义正则表达式用来匹配 img 标签 Regex regImg 61 new Regex 64 34
  • (GPU版)Pytorch+pycharm+jupyter安装记录(截至23年3月14日)

    由于搞了一台旧主机 xff0c 主机上没有pytorch等软件程序 xff0c 所以重新装一遍 xff0c 顺便记录一下 xff01 一 安装显卡GPU的驱动程序 xff0c 搞定CUDA先 WIN 43 R打开命令行 xff0c 输入命令
  • Alibaba官方最新发布的这份Java学习导图+彩版手册,真不是吹的

    时间飞逝 xff0c 转眼间毕业七年多 xff0c 从事 Java 开发也六年了 我在想 xff0c 也是时候将自己的 Java 整理成一套体系 这一次的知识体系面试题涉及到 Java 知识部分 性能优化 微服务 并发编程 开源框架 分布式
  • linux下使用第三方商店安装应用

    安装 snap store 进行下载 xff0c 相当与第三方应用商店 xff0c 但是往往比某一个官方软件源里面的应用要丰富或更实用 到 snap docs 中选择你的 linux 版本进入安装文档 xff0c 根据指示一步一步安装即可
  • Centos7离线安装sqlserver2017

    Centos7离线安装sqlserver2017 根据操作系统版本选择下载匹配的sqlserver版本 可以在这里找一下https packages microsoft com config 我选择是先在一台有网的机器上下载好rpm安装包之
  • HC-05蓝牙模块配置

    目录 1 连接蓝牙模块a 蓝牙模块通过USB转TTL连接电脑b 打开串口助手 xff0c 波特率设置为38400c 检验是否连接成功 2 配置波特率3 修改密码4 设置主从模式5 设置蓝牙连接模式6 查询自身地址7 添加配对蓝牙地址8 测试
  • Windows沙盒技术调研

    转载自 xff1a 移动云开发者社区 一 Windows沙盒技术介绍 Windows沙盒提供了轻型桌面环境 xff0c 可安全地隔离运行应用程序 沙盒环境中Windows软件保持 34 沙盒 34 状态 xff0c 并独立于主机运行 沙盒是
  • OS + Linux Shell bash / sh / ksh / csh / tcsh / adb shell

    s Android adb shell ADB Android debug bridge Android手机实际是基于Linux系统的 Google提供的ADB工具包带有fastboot exe rar http dl iteye com
  • kali利用CVE_2019_0708(远程桌面代码执行漏洞)攻击win7

    一 漏洞说明 2019年5月15日微软发布安全补丁修复了CVE编号为CVE 2019 0708的Windows远程桌面服务 xff08 RDP xff09 远程代码执行漏洞 该漏洞在不需身份认证的情况下即可远程触发 危害与影响面极大 目前
  • 数据库系统原理1

    第一章 数据库管理技术发展的不同阶段形成不同的特点 数据描述经历了三个阶段对应于三个数据模型 第二章 数据库系统的生命周期 xff0c 书中可能和我们学习软工的时候有些出入 xff0c 其实就是不同时间有不同的理解 xff0c 横看成岭侧成
  • ssh详解

    SSH ssh secure shell protocol 22 tcp 安全的 具体的软件实现 xff1a OpenSSH ssh协议的开源实现 xff0c CentOS dropbear xff1a 另一个开源实现 SSH协议版本 v1
  • spring框架的简单配置步骤——小马同学@Tian

    spring框架配置步骤 1 导入jar包 本教程使用spring5 1 5 xff0c 在pom xml中进行导入依赖 Maven方式 xff1a span class token tag span class token tag spa
  • PSReadLine - Powershell 的强化工具

    PSReadLine Powershell 的强化工具 UPDATE 2022 3 4 根据其 Github README 的说明 xff0c If you are using Windows PowerShell on Windows 1
  • 美化 PowerShell

    美化 PowerShell UPDATE 2022 3 4 本文使用的 oh my posh 基于 V2 版本 xff0c 而更新且功能更强大的新版本已经发布 xff0c 如需使用请参考其官方文档 1 准备工作 Step1 下载并安装 Po
  • nltk下载语料库

    1 首先我们使用命令pip list查看是否安装了nltk模块 xff0c 如果没有 xff0c 则执行命令pip3 install nltk进行安装 2 之后 xff0c 我们在Jupyter Notebook中进行语料库的安装 impo
  • Spark scala和java的api使用

    Spark scala和java的api使用 1 利用scala语言开发spark的worcount程序 xff08 本地运行 xff09 package com zy spark import org apache spark rdd R

随机推荐