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 基于http.server模块实现简单http服务的代码举例

《Python基于http.server模块实现简单http服务的代码举例》Pythonhttp.server模块通过继承BaseHTTPRequestHandler处理HTTP请求,使用Threa... 目录测试环境代码实现相关介绍模块简介类及相关函数简介参考链接测试环境win11专业版python

Java调用Python脚本实现HelloWorld的示例详解

《Java调用Python脚本实现HelloWorld的示例详解》作为程序员,我们经常会遇到需要在Java项目中调用Python脚本的场景,下面我们来看看如何从基础到进阶,一步步实现Java与Pyth... 目录一、环境准备二、基础调用:使用 Runtime.exec()2.1 实现步骤2.2 代码解析三、

Python如何调用另一个类的方法和属性

《Python如何调用另一个类的方法和属性》在Python面向对象编程中,类与类之间的交互是非常常见的场景,本文将详细介绍在Python中一个类如何调用另一个类的方法和属性,大家可以根据需要进行选择... 目录一、前言二、基本调用方式通过实例化调用通过类继承调用三、高级调用方式通过组合方式调用通过类方法/静

C#控制台程序同步调用WebApi实现方式

《C#控制台程序同步调用WebApi实现方式》控制台程序作为Job时,需同步调用WebApi以确保获取返回结果后执行后续操作,否则会引发TaskCanceledException异常,同步处理可避免异... 目录同步调用WebApi方法Cls001类里面的写法总结控制台程序一般当作Job使用,有时候需要控制

python连接sqlite3简单用法完整例子

《python连接sqlite3简单用法完整例子》SQLite3是一个内置的Python模块,可以通过Python的标准库轻松地使用,无需进行额外安装和配置,:本文主要介绍python连接sqli... 目录1. 连接到数据库2. 创建游标对象3. 创建表4. 插入数据5. 查询数据6. 更新数据7. 删除

Jenkins的安装与简单配置过程

《Jenkins的安装与简单配置过程》本文简述Jenkins在CentOS7.3上安装流程,包括Java环境配置、RPM包安装、修改JENKINS_HOME路径及权限、启动服务、插件安装与系统管理设置... 目录www.chinasem.cnJenkins安装访问并配置JenkinsJenkins配置邮件通知

Python用Flask封装API及调用详解

《Python用Flask封装API及调用详解》本文介绍Flask的优势(轻量、灵活、易扩展),对比GET/POST表单/JSON请求方式,涵盖错误处理、开发建议及生产环境部署注意事项... 目录一、Flask的优势一、基础设置二、GET请求方式服务端代码客户端调用三、POST表单方式服务端代码客户端调用四

Python跨文件实例化、跨文件调用及导入库示例代码

《Python跨文件实例化、跨文件调用及导入库示例代码》在Python开发过程中,经常会遇到需要在一个工程中调用另一个工程的Python文件的情况,:本文主要介绍Python跨文件实例化、跨文件调... 目录1. 核心对比表格(完整汇总)1.1 自定义模块跨文件调用汇总表1.2 第三方库使用汇总表1.3 导

使用Python的requests库调用API接口的详细步骤

《使用Python的requests库调用API接口的详细步骤》使用Python的requests库调用API接口是开发中最常用的方式之一,它简化了HTTP请求的处理流程,以下是详细步骤和实战示例,涵... 目录一、准备工作:安装 requests 库二、基本调用流程(以 RESTful API 为例)1.

Python调用LibreOffice处理自动化文档的完整指南

《Python调用LibreOffice处理自动化文档的完整指南》在数字化转型的浪潮中,文档处理自动化已成为提升效率的关键,LibreOffice作为开源办公软件的佼佼者,其命令行功能结合Python... 目录引言一、环境搭建:三步构建自动化基石1. 安装LibreOffice与python2. 验证安装