mrz*_*zbn 3 android kotlin android-jetpack-compose
我们已经知道如何使用getActivityResultRegistry方法获取Fragment中的ActivityResultRegistry。但是如何在可组合项中获取ActivityResultRegistry?
有一种方法可以使用以下代码获取实例:
LocalActivityResultRegistryOwner.current?.activityResultRegistry
Run Code Online (Sandbox Code Playgroud)
但它是可为空的。
ActivityResultRegistry
当您从片段中获取 an 时,它“可以为空”的含义与它“可以为空”的含义相同。
该方法getActivityResultRegistry
不是Fragment
类上可用的方法。ActivityResultRegistryOwner
它是属于所实现的接口的方法ComponentActivity
。
由于FragmentActivity
扩展了ComponentActivity
相同的方法,因此在使用片段时也可用,但该方法本身仍然在ActivityResultRegistryOwner
. 因此,该调用仍然需要您从一个类中引用一个对象,该类要么实现ActivityResultRegistryOwner
该类,要么从该类扩展。
在片段内部,您通常会像这样访问它(Java 代码)。
requireActivity().getActivityResultRegistry();
Run Code Online (Sandbox Code Playgroud)
它实际执行的操作如下(Java 代码)
FragmentActivity activity = getActivity();
if (activity == null) {
throw new IllegalStateException("Fragment " + this + " not attached to an activity.");
}
activity.getActivityResultRegistry();
Run Code Online (Sandbox Code Playgroud)
因此 Compose 中语义等效的代码将是(Kotlin 代码)
LocalActivityResultRegistryOwner.current!!.activityResultRegistry
Run Code Online (Sandbox Code Playgroud)
非空断言运算符 (!!)将任何值转换为非空类型,NullPointerException
如果值为 则抛出 an null
。
ActivityResultRegistry
片段中获取 的方式与 Compose 中获取 的方式的主要区别是,在ActivityResultRegistryOwner
不存在的情况下,片段中抛出的 Exception 类型与 Compose 中不同。从 Fragment 访问它会抛出一个IllegalStateException("Fragment ... not attached to an activity.")
,而在 Compose 中访问它会抛出一个NullReferenceException
.
我假设您ComponentActivity
无论如何都在 a 内部使用 Compose,因此null
在访问 时您将永远不会收到引用ActivityResultRegistryOwner.current
,因此如果您不想处理可为 null 的类型,则可以使用该!!
运算符。
归档时间: |
|
查看次数: |
447 次 |
最近记录: |