使用导航组件将自定义类型对象从片段传递到 Activity

Passing a Custom Type Object From Fragment to Activity with Navigation Component

我想使用 Navigation ComponentFragment 中的 MediaStream 对象传递给 ActivityMediaStream class 属于 WebRTC。因此,我无法触摸它以使其可打包或可序列化以传递对象。

这是片段中的代码:

// Creating a PeerConnection with two callbacks 
// one is triggered when an ICE candidate is received
// the other one is triggered when a MediaStream is received
localPeer = peerConnectionFactory.createPeerConnection(
            rtcConfig,
            object: CustomPeerConnectionObserver("localPeerCreation"){
                override fun onIceCandidate(iceCandidate: IceCandidate?) {
                   // not relevant for this talk 
                }

                override fun onAddStream(mediaStream: MediaStream?) {
                    super.onAddStream(mediaStream)
                    // TODO: create a new Activity and pass media stream to it for displaying
                    StreamsFragmentDirections.actionStreamsFragmentToStreamActivity(mediaStream)
                }
            })!!

正如 TODO 行所暗示的那样,我最初的目标是将 MediaStream 对象传递给应该显示流的新 Activity。 但我不知道该怎么做。在 Navigation Graph Editor 中,我选择了 <inferred type> 作为 mediastream 的类型,但结果并不如预期。这里,导航图xml布局的相关部分:

<activity
        android:id="@+id/streamActivity"
        android:name="com.john.elia.ui.activities.StreamActivity"
        android:label="StreamActivity" >
        <argument 
            android:name="mediaStream" />
</activity>

但是编译器抱怨说它期望一个 Int 但找到了一个 MediaStream。 如何传递 MediaStream 对象?在我发现的所有示例中,它们只展示了如何传递原始类型,如 String、Int 等。具有自定义类型的对象如何?

您可能无法让每种类型的对象都实现 Parcelable,但遵循现代应用程序架构的原则,您就不必再这样做了,另请参阅 Guide to app architecture

总体思路是将您的数据存储在一个存储库中(单一真实来源),ActivityFragment 可以通过一些自定义 class 扩展访问该存储库ViewModel.

因此,一旦您在 Fragment 中获得任何类型的数据(MediaStream),您应该将其传递到存储库,导航到下一个 UI 组件并拥有它借助其自身 ViewModel 从存储库中获取数据。