Kotlin MainActivity循环启动Activity报类型检查递归错误解决方法
报错原因
代码中两个ActivityResultLauncher变量在初始化的回调逻辑中存在循环引用:Activity1ResultLauncher的回调内调用Activity2ResultLauncher,Activity2ResultLauncher的回调内又反向调用Activity1ResultLauncher。Kotlin编译器的类型推断机制处理这类循环依赖的变量声明时,会陷入递归推导流程,无法自动完成类型计算,因此抛出该类型检查错误。
修复方案
按照报错提示,为两个launcher变量显式声明固定类型即可,原有跳转逻辑无需改动。
使用ActivityResultContracts.StartActivityForResult协定时,返回的launcher固定类型为ActivityResultLauncher<Intent>,直接给变量加上该类型声明,就能打破类型推断的递归循环。
另外需要把两个launcher的声明移动到onCreate方法之前,避免Activity生命周期初始化时序导致的空引用问题,建议添加private修饰符限制访问范围。
修复后完整代码如下:
class MainActivity : AppCompatActivity() { // 显式声明类型,打断递归类型推断链路 private val Activity1ResultLauncher: ActivityResultLauncher<Intent> = registerForActivityResult( ActivityResultContracts.StartActivityForResult() ) { result -> if (result.resultCode == Activity.RESULT_OK) { val intent = Intent(this@MainActivity, Activity2::class.java) Activity2ResultLauncher.launch(intent) } } // 显式声明类型 private val Activity2ResultLauncher: ActivityResultLauncher<Intent> = registerForActivityResult( ActivityResultContracts.StartActivityForResult() ) { result -> if (result.resultCode == Activity.RESULT_OK) { val intent = Intent(this@MainActivity, Activity1::class.java) Activity1ResultLauncher.launch(intent) } } override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val initialIntent = Intent(this@MainActivity, Activity1::class.java) Activity1ResultLauncher.launch(initialIntent) } }
补充说明:如果需要更灵活的跳转控制,也可以用布尔类型标记位记录当前要启动的页面,用单个launcher实现跳转逻辑,从根源上避免循环引用,但针对当前报错,显式声明类型是成本最低、改动最小的解决方案。
内容的提问来源于stack exchange,提问作者EliFromToronto
相关产品推荐
相关产品推荐

