Flutter-通过活动频道从Kotlin到Dart获取数据

时间:2019-12-09 15:09:13

标签: kotlin flutter dart

我已经解决了20多个小时的以下问题:我想使用事件通道从Spotify SDK中获取数据流。在本地方面,我可以通过订阅PlayerState自动显示当前歌曲的状态。我的目标是能够使用Flutter应用访问此数据流。在本机方面,我可以毫无问题地输出数据流。但我也希望能够在Flutter应用程序中访问此数据。问题是我没有从Kotlin到Dart的数据。我无法执行命令mEventSink?.success(position),因为mEventSink为零。 如果有人可以帮助我解决这个问题,那真是太好了。

//...

class Spotifysdk04Plugin(private var registrar: Registrar): MethodCallHandler, EventChannel.StreamHandler {
    //...
    private var mEventSink: EventChannel.EventSink? = null

  companion object {
    @JvmStatic
    fun registerWith(registrar: Registrar) {
      val channel = MethodChannel(registrar.messenger(), "spotifysdk")
      channel.setMethodCallHandler(Spotifysdk04Plugin(registrar))

        val eventChannel = EventChannel(registrar.messenger(), "timerStream")
        eventChannel.setStreamHandler(Spotifysdk04Plugin(registrar))
    }
  }

  override fun onMethodCall(call: MethodCall, result: Result) {
    if (call.method == "loginAppRemote") {
        //...
    } else if(call.method == "initEventStream") {
        try {
            spotifyAppRemote!!.playerApi.subscribeToPlayerState()
                    .setEventCallback { playerState: PlayerState? ->
                        Log.d("test", "test24")
                        var position = playerState!!.playbackPosition.toDouble()
                        Log.d("playbackPosition1", position.toString())
                        if(mEventSink != null) {
                            Log.d("test", "test25")
                            mEventSink?.success(position)
                        } else {
                            Log.d("test", "mEventSink == null")
                        }
                    }
        } catch (err:Throwable) {
            Log.v("initEventStreamError",err.message.toString())
            result.success(false)
        }
    } else {
      result.notImplemented()
    }
  }

    override fun onCancel(arguments: Any?) {
        mEventSink = null
    }

    override fun onListen(arguments: Any?, eventSink: EventChannel.EventSink) {
        mEventSink = eventSink
    }
}

1 个答案:

答案 0 :(得分:0)

我找到了解决方法:

override fun onListen(p0: Any?, p1: EventChannel.EventSink?) {
        mEventSink = p1
        Log.d("test", "test1")
        if(spotifyAppRemote == null) {
            Log.d("test", "test2")
        }

        val connectionParams = ConnectionParams.Builder(clientId)
                .setRedirectUri(redirectUri)
                .showAuthView(true)
                .build()

        SpotifyAppRemote.connect(registrar.context(), connectionParams, object : Connector.ConnectionListener {
            override fun onConnected(appRemote: SpotifyAppRemote) {
                spotifyAppRemote = appRemote
                if(spotifyAppRemote != null) {
                    Log.d("test", "test3")
                    spotifyAppRemote!!.playerApi.subscribeToPlayerState()
                            .setEventCallback { playerState: PlayerState? ->
                                Log.d("test", "test24")
                                var position = playerState!!.playbackPosition.toDouble()
                                Log.d("playbackPosition1", position.toString())
                                if(mEventSink != null) {
                                    Log.d("test", "test25")
                                    mEventSink?.success(position)
                                } else {
                                    Log.d("test", "mEventSink == null")
                                }
                            }
                }

                Log.d("Spotify App Remote Login", "Connected!")
            }

            override fun onFailure(throwable: Throwable) {
                Log.e("Spotify App Remote Login", "Error!", throwable)
            }
        })
    }