使用导航组件将自定义类型对象从片段传递到 Activity
Passing a Custom Type Object From Fragment to Activity with Navigation Component
我想使用 Navigation Component
将 Fragment
中的 MediaStream
对象传递给 Activity
。 MediaStream
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
总体思路是将您的数据存储在一个存储库中(单一真实来源),Activity
和 Fragment
可以通过一些自定义 class 扩展访问该存储库ViewModel
.
因此,一旦您在 Fragment
中获得任何类型的数据(MediaStream
),您应该将其传递到存储库,导航到下一个 UI 组件并拥有它借助其自身 ViewModel
从存储库中获取数据。
我想使用 Navigation Component
将 Fragment
中的 MediaStream
对象传递给 Activity
。 MediaStream
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
总体思路是将您的数据存储在一个存储库中(单一真实来源),Activity
和 Fragment
可以通过一些自定义 class 扩展访问该存储库ViewModel
.
因此,一旦您在 Fragment
中获得任何类型的数据(MediaStream
),您应该将其传递到存储库,导航到下一个 UI 组件并拥有它借助其自身 ViewModel
从存储库中获取数据。