问题描述
我试图在活动中要求获得许可,然后获得compose的功能,但是当我第一次获得许可时,它无法直接获得compose的内容。
class MainActivity : AppCompatActivity() {
val viewmodel by viewmodels<Mainviewmodel>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
if (allPermissionsGranted()) {
// the setContent code not executed after getting the permission first time
setContent {
MyTheme {
Main(
viewmodel = viewmodel,backdispatcher = onBackpresseddispatcher
)
}
}
} else {
ActivityCompat.requestPermissions(
this,required_PERMISSIONS,REQUEST_CODE_PERMISSIONS)
}
}
private fun allPermissionsGranted() = required_PERMISSIONS.all {
ContextCompat.checkSelfPermission(
baseContext,it) == PackageManager.PERMISSION_GRANTED
}
companion object {
private const val REQUEST_CODE_PERMISSIONS = 10
private val required_PERMISSIONS = arrayOf(Manifest.permission.CAMERA)
}
}
解决方法
授予权限后不会重新创建活动。因此,在您的情况下,授予权限后,应用程序中什么也不会发生。这与撰写无关。您在setContentView()
所在的setContent {}
处将得到相同的行为。
将setContent {}
逻辑移到其他函数中。从您现在拥有的onCreate()
处调用它。并且,覆盖onRequestPermissionsResult()
,如果被授予权限,则从那里调用该函数。
另一种Compose-y方法将是remember
是否拥有许可,如果被授予许可,则从onRequestPermissionsResult()
更新该状态。从 inside setContent()
进行所有操作,然后Compose将根据状态更改进行重新组合。
嗨,您可以使用片段来实现它。 您应该检查权限,请求并处理响应
如果授予了权限->导航至片段
如果未授予权限,请等到用户授予并响应后->导航至片段