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

2024-02-27 09:28

本文主要是介绍flutter简单的MethodChannel通道Demo(引入调用小红书sdk),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

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.timerTaskclass MethodChannelDemo(messenger: BinaryMessenger, var activity : Activity) : MethodCallHandler {private var channel: MethodChannelprivate var count = 0init {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>>() {}.typeval 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>>() {}.typeval 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)}//小红书分享sdkprivate 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.atuiimport 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.GeneratedPluginRegistrantclass 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')
    在这里插入图片描述

这篇关于flutter简单的MethodChannel通道Demo(引入调用小红书sdk)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/751951

相关文章

Python调用Orator ORM进行数据库操作

《Python调用OratorORM进行数据库操作》OratorORM是一个功能丰富且灵活的PythonORM库,旨在简化数据库操作,它支持多种数据库并提供了简洁且直观的API,下面我们就... 目录Orator ORM 主要特点安装使用示例总结Orator ORM 是一个功能丰富且灵活的 python O

Java调用DeepSeek API的最佳实践及详细代码示例

《Java调用DeepSeekAPI的最佳实践及详细代码示例》:本文主要介绍如何使用Java调用DeepSeekAPI,包括获取API密钥、添加HTTP客户端依赖、创建HTTP请求、处理响应、... 目录1. 获取API密钥2. 添加HTTP客户端依赖3. 创建HTTP请求4. 处理响应5. 错误处理6.

C++初始化数组的几种常见方法(简单易懂)

《C++初始化数组的几种常见方法(简单易懂)》本文介绍了C++中数组的初始化方法,包括一维数组和二维数组的初始化,以及用new动态初始化数组,在C++11及以上版本中,还提供了使用std::array... 目录1、初始化一维数组1.1、使用列表初始化(推荐方式)1.2、初始化部分列表1.3、使用std::

如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解

《如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别详解》:本文主要介绍如何通过海康威视设备网络SDK进行Java二次开发摄像头车牌识别的相关资料,描述了如何使用海康威视设备网络SD... 目录前言开发流程问题和解决方案dll库加载不到的问题老旧版本sdk不兼容的问题关键实现流程总结前言作为

redis群集简单部署过程

《redis群集简单部署过程》文章介绍了Redis,一个高性能的键值存储系统,其支持多种数据结构和命令,它还讨论了Redis的服务器端架构、数据存储和获取、协议和命令、高可用性方案、缓存机制以及监控和... 目录Redis介绍1. 基本概念2. 服务器端3. 存储和获取数据4. 协议和命令5. 高可用性6.

Deepseek R1模型本地化部署+API接口调用详细教程(释放AI生产力)

《DeepseekR1模型本地化部署+API接口调用详细教程(释放AI生产力)》本文介绍了本地部署DeepSeekR1模型和通过API调用将其集成到VSCode中的过程,作者详细步骤展示了如何下载和... 目录前言一、deepseek R1模型与chatGPT o1系列模型对比二、本地部署步骤1.安装oll

一分钟带你上手Python调用DeepSeek的API

《一分钟带你上手Python调用DeepSeek的API》最近DeepSeek非常火,作为一枚对前言技术非常关注的程序员来说,自然都想对接DeepSeek的API来体验一把,下面小编就来为大家介绍一下... 目录前言免费体验API-Key申请首次调用API基本概念最小单元推理模型智能体自定义界面总结前言最

JAVA调用Deepseek的api完成基本对话简单代码示例

《JAVA调用Deepseek的api完成基本对话简单代码示例》:本文主要介绍JAVA调用Deepseek的api完成基本对话的相关资料,文中详细讲解了如何获取DeepSeekAPI密钥、添加H... 获取API密钥首先,从DeepSeek平台获取API密钥,用于身份验证。添加HTTP客户端依赖使用Jav

redis防止短信恶意调用的实现

《redis防止短信恶意调用的实现》本文主要介绍了在场景登录或注册接口中使用短信验证码时遇到的恶意调用问题,并通过使用Redis分布式锁来解决,具有一定的参考价值,感兴趣的可以了解一下... 目录1.场景2.排查3.解决方案3.1 Redis锁实现3.2 方法调用1.场景登录或注册接口中,使用短信验证码场

使用C/C++调用libcurl调试消息的方式

《使用C/C++调用libcurl调试消息的方式》在使用C/C++调用libcurl进行HTTP请求时,有时我们需要查看请求的/应答消息的内容(包括请求头和请求体)以方便调试,libcurl提供了多种... 目录1. libcurl 调试工具简介2. 输出请求消息使用 CURLOPT_VERBOSE使用 C