从androidx.activity:activity-ktx
的1.2.0-beta 01开始,人们不能再launch
使用Activity.registerForActivityResult()
创建的请求,如上面的链接中“行为更改”和Google issue here中所示。
应用程序现在应该如何通过@Composable
函数启动此请求?以前,应用程序可以通过使用Ambient
将MainActivity
的示例向下传递,然后轻松启动请求。
新的行为可以通过以下方式来解决,例如,在Activity的onCreate
函数外部示例化后,将注册Activity结果的类向下传递,然后在Composable
中启动请求。但是,注册完成后要执行的回调不能通过这种方式完成。
可以通过创建自定义的ActivityResultContract
来解决这个问题,它在启动时接受一个回调。然而,这意味着几乎没有内置的ActivityResultContracts
可以与Jetpack Compose一起使用。
TL;DR
应用如何从@Composable
函数启动ActivityResultsContract
请求?
6条答案
按热度按时间8cdiaqws1#
从
androidx.activity:activity-compose:1.3.0-alpha06
开始,registerForActivityResult()
API已重命名为rememberLauncherForActivityResult()
,以更好地指示返回的ActivityResultLauncher
是代表您记住的托管对象。wmomyfyw2#
“活动结果”有两个API图面:
ActivityResultRegistry
。这就是实际做底层工作的东西。ComponentActivity
和Fragment
实现的ActivityResultCaller
中的一个便利接口,用于将Activity Result请求与Activity或Fragment的生命周期联系起来Composable与Activity或Fragment具有不同的生命周期(例如,如果您将Composable从层次结构中删除,它应该在自己之后进行清理),因此使用
ActivityResultCaller
API(如registerForActivityResult()
)永远都不是正确的做法。相反,您应该直接使用
ActivityResultRegistry
API,直接调用register()
和unregister()
。这最好与rememberUpdatedState()
和DisposableEffect
搭配使用,以创建与Composable一起工作的registerForActivityResult
版本:然后可以通过代码在您自己的Composable中使用它,例如:
ffscu2ro3#
在
Activity Compose 1.3.0-alpha03
及以后版本中,有一个新的效用函数registerForActivityResult()
可以简化这个过程。(From给定样本here)
9rygscc14#
如果有人开始新的外部意图,则添加。在我的例子中,我想在jetpack compose中点击按钮时启动一个谷歌登录提示。
宣布你的发射意图
启动新活动或任何Intent。
googlesignin
ecfdbz9o5#
对于那些没有得到@ianhanniballake提供的要点结果的人,在我的例子中,
returnedLauncher
实际上捕获了realLauncher
的一个已经处理的值。因此,虽然删除间接层应该可以解决这个问题,但这绝对不是最佳的方法。
以下是更新的版本,直到找到更好的解决方案:
ijxebb2r6#
对向用户请求权限的方法的调用(例如launchPermissionRequest())需要从不可组合的作用域调用。