如何在 Jetpack Compose 中获取 ActivityResultRegistry?

mrz*_*zbn 3 android kotlin android-jetpack-compose

我们已经知道如何使用getActivityResultRegistry方法获取Fragment中的ActivityResultRegistry。但是如何在可组合项中获取ActivityResultRegistry

有一种方法可以使用以下代码获取实例:

LocalActivityResultRegistryOwner.current?.activityResultRegistry
Run Code Online (Sandbox Code Playgroud)

但它是可为空的

Ma3*_*a3x 5

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 的类型,则可以使用该!!运算符。