Передача объекта пользовательского типа из фрагмента в действие с компонентом навигации - PullRequest
1 голос
/ 17 января 2020

Я хотел передать MediaStream объект в Fragment в Activity, используя Navigation Component. Класс MediaStream относится к 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 в новое действие, которое должно отображать поток. Но я не знал, как это сделать. В редакторе навигационных графиков я выбрал <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 et c. Как насчет объектов с пользовательскими типами?

1 Ответ

1 голос
/ 17 января 2020

Возможно, вы не сможете заставить каждый тип объекта реализовывать Parcelable, но, следуя принципам современной архитектуры приложения, вам больше не нужно этого делать, см. Также Руководство по архитектуре приложения.

Общая идея состоит в том, чтобы хранить ваши данные в хранилище (единственном источнике правды), к которому могут обращаться Activity s и Fragment s через некоторый пользовательский класс, расширяющий ViewModel.

Поэтому, как только вы получите данные любого типа (MediaStream) в Fragment, вы должны передать их в хранилище, перейти к следующему компоненту пользовательского интерфейса и получить данные из хранилища с помощью помощь собственной ViewModel.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...