Day24 Plugin 从零开始到上架 - FlutterPlugin与 MethodCallHandler

InstagramBasicDisplayApiPlugin

class InstagramBasicDisplayApiPlugin : FlutterPlugin, ActivityAware {

  private lateinit var methodCallHandler: MethodCallHandlerImpl
  private val instagramBasicDisplayApi: InstagramBasicDisplayApi = getKoinInstance()

  override fun onAttachedToEngine(@NonNull flutterPluginBinding: FlutterPlugin.FlutterPluginBinding) {
    methodCallHandler = MethodCallHandlerImpl(instagramBasicDisplayApi)
    methodCallHandler.startListening(flutterPluginBinding.binaryMessenger)
  }

  override fun onDetachedFromEngine(@NonNull binding: FlutterPlugin.FlutterPluginBinding) {
    methodCallHandler.stopListening()
  }

  override fun onAttachedToActivity(binding: ActivityPluginBinding) {
    instagramBasicDisplayApi.setActivityPluginBinding(binding)
  }

  override fun onDetachedFromActivity() {
    instagramBasicDisplayApi.detachActivity()
  }

  override fun onReattachedToActivityForConfigChanges(binding: ActivityPluginBinding) {
    onAttachedToActivity(binding)
  }

  override fun onDetachedFromActivityForConfigChanges() {
    onDetachedFromActivity()
  }
}

MethodCallHandlerImpl


class MethodCallHandlerImpl(private val instagramBasicDisplayApi: InstagramBasicDisplayApi) :
    MethodChannel.MethodCallHandler {

    private val TAG = javaClass.name
    private var channel: MethodChannel? = null

    init {
        instagramBasicDisplayApi.startListening(
            userUpdated = {
                channel?.invokeMethod("userUpdated", hashMapOf("ID" to it.id, "USER_NAME" to it.username, "ACCOUNT_TYPE" to it.accountType))
            },
            mediasUpdated = {
                channel?.invokeMethod("mediasUpdated", hashMapOf("DATA" to it))
            },
            albumDetailUpdated = {
                channel?.invokeMethod("albumDetailUpdated", hashMapOf("DATA" to it))
            },
            mediaItemUpdated = {
                channel?.invokeMethod("mediaItemUpdated", it)
            },
            errorUpdated = {
                channel?.invokeMethod("errorUpdated", hashMapOf("ERROR_TYPE" to it))
            }
        )
    }

    override fun onMethodCall(@NonNull call: MethodCall, @NonNull result: MethodChannel.Result) {
        when (call.method) {
            "getPlatformVersion" -> {
                result.success("Android ${android.os.Build.VERSION.RELEASE}")
            }
            "askInstagramToken" -> {
                instagramBasicDisplayApi.askInstagramToken()
                result.success(null)
            }
            "getInstagramUser" -> {
                instagramBasicDisplayApi.getInstagramUser()
                result.success(null)
            }
            "getMedias" -> {
                instagramBasicDisplayApi.getMedias()
                result.success(null)
            }
            "getAlbumDetail" -> {
                println("getAlbumDetail\n")
                val arguments = call.arguments as? HashMap<*, *> ?: return
                val albumId = arguments["albumId"] as String? ?: return
                println("getAlbumDetail albumId = $albumId")
                instagramBasicDisplayApi.getAlbumDetail(albumId)
                result.success(null)
            }
            "getMediaItem" -> {
                println("getMediaItem\n")
                val arguments = call.arguments as? HashMap<*, *> ?: return
                val mediaId = arguments["mediaId"] as String? ?: return
                println("getMediaItem mediaId = $mediaId")
                instagramBasicDisplayApi.getMediaItem(mediaId)
                result.success(null)
            }
            "logout" -> {
                instagramBasicDisplayApi.logout()
                result.success(null)
            }
            else -> {
                result.notImplemented()
            }
        }
    }

    fun startListening(messenger: BinaryMessenger?) {
        if (channel != null) {
            Log.wtf(TAG, "Setting a method call handler before the last was disposed.")
            stopListening()
        }
        channel = MethodChannel(messenger, "instagram_basic_display_api").apply {
            setMethodCallHandler(this@MethodCallHandlerImpl)
        }
    }

    fun stopListening() {
        if (channel == null) {
            Log.d(TAG, "Tried to stop listening when no MethodChannel had been initialized.")
            return
        }
        channel!!.setMethodCallHandler(null)
        channel = null
    }
}

<<:  Day28-介绍 Redux DevTools

>>:  Day 30 建立一个好口碑

[DAY10] 用 Automated ML 快速开发

DAY10 用 Automated ML 快速开发 今天我们来体验一下 AML 的 Automate...

均线的重要性-价值千金

均线是我在技术面非常倚重的指标之一。 个人认为,它非常非常重要,原因在於,了解均线不一定能帮你赚大钱...

Day30 居然到了这一天

完全没想到一转眼第30天就这样到来了,从开赛前的信心满满,总觉得可以将脑袋里的东西通通有条理地讲出来...

[JS] You Don't Know JavaScript [Scope & Closures] - Limiting Scope Exposure ?

前言 目前为止我们都着重在解释作用域与变量的工作机制,有了这些基础後将进到下一步,首先我们要先探讨不...

浅谈注册Google戈 Play Developer

若要发布开发的软件到Google Play,要先成为Google Play Developer。成为...