问题描述
嗨,我想知道是否有更好的方法来使用作用域函数而不是 if else 来编写这行代码。我想根据我的 .addTOBackStack()
变量链接 addToStack
函数
if(addToStack){
supportFragmentManager
.beginTransaction()
.replace(R.id.fragment_container,FeedViewFragment)
.addToBackStack(null)
.commit()
}else{
supportFragmentManager
.beginTransaction()
.replace(R.id.fragment_container,FeedViewFragment)
.commit()
}
解决方法
您可以使用 let()
范围函数将其链接起来:
supportFragmentManager
.beginTransaction()
.replace(R.id.fragment_container,feedViewFragment)
.let{ if (addToStack) it.addToBackStack(null) else it }
.commit()
这有点繁琐(因为在不进行任何其他处理时需要返回 it
),但它适合任何链。
如果 addToBackStack()
只是返回调用它的对象(即它是一个 ‘fluent’ 接口),那么使用 also()
可能会更简单一些:
supportFragmentManager
.beginTransaction()
.replace(R.id.fragment_container,feedViewFragment)
.also{ if (addToStack) it.addToBackStack(null) }
.commit()
当然,如果处理变得庞大而复杂,这可能会使代码变得非常难以阅读 - 因此也值得考虑使用临时变量来拆分链(根据另一个答案)。
,除非您的 addToBackStack
具有某种检查机制(可以有效地将您的 if else loop
逻辑移动到您的 addToBackStack
代码中),否则您无法真正摆脱这里的 if else 循环
如果您想要更短、更易读的代码,这是一种方法:
sfm = supportFragmentManager
.beginTransaction()
.replace(R.id.fragment_container,feedViewFragment)
sfm = addToStack ? sfm.addToBackStack(null) : sfm
sfm.commit()
或使用三元到其最大值:
sfm = supportFragmentManager
.beginTransaction()
.replace(R.id.fragment_container,feedViewFragment)
addToStack ? sfm.addToBackStack(null).commit() : sfm.commit()