flutter简单的MethodChannel通道Demo(引入调用小红书sdk)

本文介绍了如何在Flutter应用中创建MethodChannel类,以便与Android原生模块通信,以及如何使用Gson解析数据并实现与小红书分享SDK的集成,展示了跨平台通信的基本流程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

flutter端创建MethodChannel类

import 'package:flutter/services.dart';

//MethodChannel
const methodChannel = const MethodChannel('com.flutter.demo.MethodChannel');

class FlutterMethodChannel {
  /*
 * MethodChannel flutter给原生发信息
 * 在方法通道上调用方法invokeMethod
 * methodName 方法名称
 * params 发送给原生的参数
 * res 原生发给Flutter的参数
 */
  static Future<Map> invokeNativeMethod(String methodName,
      [Map params]) async {
    var res;
    try {
      if (params == null) {
        res = await methodChannel.invokeMethod('$methodName');
      } else {
        res = await methodChannel.invokeMethod('$methodName', params);
      }
    } catch (e) {
      res = {'Failed': e.toString()};
    }
    return res;
  }

  /*
 * MethodChannel
 * 接收methodHandler 接收原生给flutter发送的信息
 */
  static void methodHandlerListener(Future<dynamic> Function(MethodCall call) handler) {
    methodChannel.setMethodCallHandler(handler);
  }
}

android端

import android.annotation.SuppressLint
import android.app.Activity
import android.util.Log
import androidx.annotation.Nullable
import com.google.gson.Gson
import com.google.gson.reflect.TypeToken
import com.xingin.xhssharesdk.XhsShareSdkTools
import com.xingin.xhssharesdk.callback.XhsShareCallback
import com.xingin.xhssharesdk.callback.XhsShareRegisterCallback
import com.xingin.xhssharesdk.core.XhsShareSdk
import com.xingin.xhssharesdk.model.config.XhsShareGlobalConfig
import com.xingin.xhssharesdk.model.sharedata.*
import io.flutter.plugin.common.BinaryMessenger
import io.flutter.plugin.common.MethodCall
import io.flutter.plugin.common.MethodChannel
import io.flutter.plugin.common.MethodChannel.MethodCallHandler
import java.lang.reflect.Type
import java.util.*
import java.util.ArrayList
import java.util.Objects
import kotlin.concurrent.timerTask

class MethodChannelDemo(messenger: BinaryMessenger, var activity : Activity) : MethodCallHandler {
    private var channel: MethodChannel
    private var count = 0

    init {
        channel = MethodChannel(messenger,"com.flutter.demo.MethodChannel") //通道标识两端要保持一致
        channel.setMethodCallHandler(this)
        /*channel.setMethodCallHandler{
            call, result ->
            if (call.method == "sendData"){


            }
        }*/
    }

    ///Flutter端调用invokeMethod方法的回调
    override fun onMethodCall(call: MethodCall, result: MethodChannel.Result) {
        if (call.method == "sendData") {
            var articleTitle = call.argument("title") as String?
            var articleContent = call.argument("articleContent") as String?
            val articlePicJsonArray = call.argument("articlePic") as String?
            val articleType = call.argument("articleType") as Int?

           // val jsonArray = call.argument("articlePic") as ArrayList<Object>?
         //   val jsonArray = call.argument("articlePic") as List<Any>?
         //   val jsonArray = call.argument("articlePic") as List<Map<String, Any>>?

            Log.i("onMethodCall","title= $articleTitle  ")
            Log.i("onMethodCall","articleContent= $articleContent  ")
            Log.i("onMethodCall","articleType= $articleType  ")
            Log.i("onMethodCall","articlePic= $articlePicJsonArray  ")

            val gson = Gson()
           /* val listType: Type = object : TypeToken<List<ArticlePic>>() {}.type
            val articlePicList : List<ArticlePic?> = gson.fromJson(articlePicJsonArray, listType)
            Log.i("onMethodCall","articlePicList type = ${articlePicList[0]?.type}  ")
            Log.i("onMethodCall","articlePicList url = ${articlePicList[0]?.url}  ")*/



            val listType: Type = object : TypeToken<List<String>>() {}.type
            val articlePicList : List<String?> = gson.fromJson(articlePicJsonArray, listType)
            Log.i("onMethodCall","articlePicList = ${articlePicList.size}  ")
            var map = mapOf("title" to "$articleTitle", "articleContent" to "$articleContent", "articlePic" to "$articlePicList")

            initXhsSDK(articleTitle,articleContent,articlePicList,articleType)
            result.success(map)
        }
    }

    ///Native 端主动发送数据给 Flutter时,Native 端代码需要在主线程中执行
    fun invokeNativeMethod(methodName : String,params : Map<String,*>){
        activity.runOnUiThread {
            channel.invokeMethod(methodName, params)
        }
        //销毁
    }

    fun startTimer() {
        var timer = Timer().schedule(timerTask {
            activity.runOnUiThread {
                var map = mapOf("count" to count++)
                channel.invokeMethod("methodToFlutter", map)
            }
        }, 0, 1000)

    }


    //小红书分享sdk
    private fun initXhsSDK(articleTitle : String?, articleContent: String?, articlePicList : List<String?>, articleType : Int?){
        Log.i("init","sendData init xhs")
        XhsShareSdk.registerApp(activity.applicationContext, "小红书appkey",
            XhsShareGlobalConfig().setEnableLog(true).setClearCacheWhenShareComplete(true),
            object : XhsShareRegisterCallback {
                override fun onSuccess() {
                    Log.i("xhs","注册成功")
                   // print( "onSuccess: 注册成功!")
                }

                override fun onError(
                    errorCode: Int,
                    errorMessage: String,
                    @Nullable exception: Exception?
                ) {
                    Log.i("xhs","注册失败!errorCode: $errorCode errorMessage: $errorMessage exception: $exception")
                    //print( "onError: 注册失败!errorCode: $errorCode errorMessage: $errorMessage exception: $exception")
                }
            })
        var imageUrlList : MutableList<XhsImageResourceBean?> = ArrayList()

        if(articleType == 1){
            articlePicList.forEach{ element ->
                imageUrlList.add(XhsImageResourceBean.fromUrl(element))
            }
        }

        var isInstalled = XhsShareSdkTools.isXhsInstalled(activity.applicationContext)
        if(isInstalled){
            var note : XhsNote? = XhsNote()
            activity.runOnUiThread {
                if(articleType == 1){
                    note = XhsNote().apply {
                        title = "$articleTitle"
                        content = "$articleContent"
                        /*   imageInfo = XhsImageInfo(listOf(
                           //    XhsImageResourceBean.fromUrl("https://zmkx.oss-cn-hangzhou.aliyuncs.com/oss/client/user/1684727167914-6443e07877e247e8a360fa293c8bc0e4..png")
                               //   XhsImageResourceBean.fromUrl("/sdcard/Picture/1621565875992.jpg")
                           ))*/
                        imageInfo = XhsImageInfo(imageUrlList)
                    }
                }else if(articleType == 2){
                    note = XhsNote().apply {
                        title = "$articleTitle"
                        content = "$articleContent"
                        videoInfo = XhsVideoInfo(
                            XhsVideoResourceBean.fromUrl(articlePicList[0]),     // 视频
                            XhsImageResourceBean.fromUrl(articlePicList[1])      // 封面
                        )
                    }
                }else {
                    note = XhsNote().apply {
                        title = "$articleTitle"
                        content = "$articleContent"
                    }
                }

                val sessionId = XhsShareSdk.shareNote(activity.applicationContext, note)

                  XhsShareSdk.setShareCallback(object : XhsShareCallback {
                      override fun onSuccess(p0: String?) {
                          TODO("Not yet implemented")
                          Log.i("xhs", "onSuccess: 分享成功!!! $p0")
                          var map = mapOf("shareCallback" to true)
                          channel.invokeMethod("xhsShareCallback", map)
                          XhsShareSdk.setShareCallback(null)
                      }

                      override fun onError(p0: String, p1: Int, p2: String, p3: Throwable?) {
                          TODO("Not yet implemented")
                          Log.i("xhs", "onSuccess: 分享失败!!!")
                          var map = mapOf("shareCallback" to true)
                          channel.invokeMethod("xhsShareCallback", map)
                          XhsShareSdk.setShareCallback(null)
                      }
                  })
            }

        }
    }
}

在MainActivity.kt中配置通道

package cn.adazon.atui

import android.os.Build
import android.os.Bundle
import androidx.annotation.NonNull
/*import com.huawei.agconnect.common.network.AccessNetworkManager
import com.huawei.hms.analytics.HiAnalytics
import com.huawei.hms.analytics.HiAnalyticsTools*/
import io.flutter.embedding.android.FlutterActivity
import io.flutter.embedding.engine.FlutterEngine
import io.flutter.plugins.GeneratedPluginRegistrant

class MainActivity : FlutterActivity() {

    override fun configureFlutterEngine(@NonNull flutterEngine: FlutterEngine) {
        GeneratedPluginRegistrant.registerWith(flutterEngine)
        MethodChannelDemo(flutterEngine.dartExecutor.binaryMessenger,activity)
    }

    /**
     * 设置状态栏沉浸式透明(修改flutter状态栏黑色半透明为全透明)
     */
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.LOLLIPOP){
            window.statusBarColor=0
        }
    }
}

小红书sdk配置

  1. 从小红书分享开放平台下载sdk
  2. 将.arr包复制到libs文件夹下
    在这里插入图片描述
  3. 引入.arr包
    在android>app目录下的build.gradle中配置 implementation fileTree(dir: 'libs', includes: ['*.aar'])
    在这里插入图片描述
    另一种引入方式
    在android目录下的build.gradle中配置flatDir { dir 'libs' }
    在这里插入图片描述
    android>app>build.gradle中配置implementation(name:'xhssharesdk-1.1.6', ext:'aar')
    在这里插入图片描述
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值