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')
    在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/2812255.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

【服务器数据恢复】ext3文件系统下硬盘坏道掉线的数据恢复案例

服务器数据恢复环境&#xff1a; 一台IBM某型号服务器上有16块FC硬盘组建RAID阵列。上层linux操作系统&#xff0c;ext3文件系统&#xff0c;部署有oracle数据库。 服务器故障&检测&#xff1a; 服务器上跑的业务突然崩溃&#xff0c;管理员发现服务器上有2块磁盘的指示灯…

海智算法训练营第三十三天 | 第八章 贪心算法 part03 | ● 1005.K次取反后最大化的数组和 ● 134. 加油站● 135. 分发糖果

今日任务&#xff1a; 1.k次取反后最大化数组和 2.贪心解决加油站问题 3.左右边界分别处理——分发糖果 1.k次取反后最大化数组和 力扣题目链接 这道题比较简单就不多说了。 class Solution {public int largestSumAfterKNegations(int[] nums, int k) {Arrays.sort(nums);f…

AS-V1000 视频监控平台产品介绍:客户端功能介绍(五)

目 录 一、引言 1.1 AS-V1000视频监控平台介绍 1.2平台服务器配置说明 二、软件概述 2.1 客户端软件用途 2.2 客户端功能 三、客户端功能说明 3.1系统配置 3.2 服务器时间校正 3.3退出 一、引言 1.1 AS-V1000视频监控平台介绍 AS-V1000视频监控平台…

【Python数据分析系列】多个dataframe写入同一个excel文件(案例源码)

一、引言 将多个DataFrame写入同一个excel文件中&#xff0c;每个DataFrame作为一个sheet&#xff0c;可以使用pandas库中的ExcelWriter类。这个类可以在一个Excel文件中创建多个sheet&#xff0c;并将不同的数据写入这些sheet中。本文演示如何将多个DataFrame写入同一个CSV文件…

用C#开发Excel插件的强大开源工具

推荐一个开源项目&#xff0c;方便我们使用C#为Excel开发插件。 01 项目简介 Excel-DNA是一个.Net开源项目&#xff0c;为开发者提供了一种便利的方法&#xff0c;可以将.Net代码与Excel集成&#xff0c;能够轻松的为Excel创建自定义函数、图表、表单等&#xff0c;一方面不仅…

<网络安全>《55 概念讲解<第二课 MAC地址>》

1 MAC地址是什么&#xff1f; MAC地址&#xff08;Media Access Control Address&#xff09;是一种标识网络设备的唯一地址&#xff0c;也被称为物理地址或硬件地址。它由网络设备制造商在生产过程中写入网卡的EPROM&#xff08;一种可擦写的闪存芯片&#xff09;。 IP地址和…

状态机-----

1.原理 同步的意思就是状态的跳转都是在时钟的作用下跳转的&#xff0c;有限是指状态机中状态的个数是有限的。两种状态机的共同点都是状态的跳转只和输入有关&#xff0c;区别就是如果最后的输出只和当前状态有关而与输入无关&#xff0c;则是moore型状态机。如果最后的输出不…

华为配置AP和AC之间NAT穿越示例

配置AP和AC之间NAT穿越示例 组网图形 图1 组网配置图 业务需求组网需求数据规划配置思路配置注意事项操作步骤配置文件 业务需求 企业用户接入WLAN网络&#xff0c;以满足移动办公的最基本需求。且在覆盖区域内移动发生漫游时&#xff0c;不影响用户的业务使用。 AP位于企业分部…

C/C++基础语法

C/C基础语法 文章目录 C/C基础语法头文件经典问题秒数转换闰年斐波那契数列打印n阶菱形曼哈顿距离菱形图案的定义大数计算 输入输出格式化输入输出getline()函数解决cin只读入一个单词的问题 运算符赋值运算符 Switch循环处理未知数量输入的几种常见方法for-each 字符串String字…

【Java EE初阶二十五】简单的表白墙(一)

1. 前端部分 1.1 前端代码 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta http-equiv"X-UA-Compatible" content"IEedge"><meta name"viewport" content"wid…

【嵌入式学习】QT-Day4-Qt基础

简单实现闹钟播报&#xff0c;设置时间&#xff0c;当系统时间与设置时间相同时播报语音5次&#xff0c;然后停止。如果设置时间小于当前系统时间&#xff0c;则弹出消息提示框&#xff0c;并清空输入框。 #include "my_clock.h" #include "ui_my_clock.h&quo…

远程控制APP,高效生活的秘诀!

在这个科技日新月异的时代&#xff0c;我们的生活被各种手机软件所包围。几乎每个人都有一个甚至多个手机&#xff0c;你是否也有遇到过需要远程操作自己某一台手机的场景呢&#xff1f;今天&#xff0c;我要向大家推荐一款神奇的手机远程操作神器&#xff0c;让你可以随时随地…

C++ //练习 9.5 重写上一题的函数,返回一个迭代器指向找到的元素。注意,程序必须处理未找到给定值的情况。

C Primer&#xff08;第5版&#xff09; 练习 9.5 练习 9.5 重写上一题的函数&#xff0c;返回一个迭代器指向找到的元素。注意&#xff0c;程序必须处理未找到给定值的情况。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 3工具&#xff1a;vim 代码块 …

Anaconda和TensorFlow环境搭建!!

Anaconda下载 进入官网下载 https://www.anaconda.com/download 也可以通过清华的映像站下载&#xff1a; https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/ 我这里下载的是3.4.20版本。下载好就可以安装默认安装就行。 打开Anaconda Prompt修改成国内镜像 conda c…

Coursera吴恩达机器学习专项课程02:Advanced Learning Algorithms 笔记 Week01

Advanced Learning Algorithms Week 01 笔者在2022年7月份取得这门课的证书&#xff0c;现在&#xff08;2024年2月25日&#xff09;才想起来将笔记发布到博客上。 Website: https://www.coursera.org/learn/advanced-learning-algorithms?specializationmachine-learning-in…

Kafka源码搭建以及系统架构

Kafka源码分析环境搭建 使用截止目前为止Kafka的最新版本3.3.1版本的源码进行环境搭建 Kafka源码下载 从kafka官网下载kafka-3.3.1版本的源码 http://kafka.apache.org/downloads 解压(要放到英文目录&#xff0c;不然会报一些奇怪的错误) Scala安装 因为在源码中配置的sc…

什么是SSH端口转发?

目录 前言&#xff1a; 一、SSH端口转发的概念 二、SSH端口转发的类型 2.1 本地端口转发 2.2 远程端口转发 2.3 动态端口转发 三、SSH端口转发的用途 3.1 安全远程访问 3.2 跨越网络限制 3.3 加密流量传输 3.4 跨越 NAT 网络 3.5 安全代理 四、总结 前言&#xff…

AI:138-开发一种能够自动化生成艺术品描述的人工智能系统

🚀点击这里跳转到本专栏,可查阅专栏顶置最新的指南宝典~ 🎉🎊🎉 你的技术旅程将在这里启航! 从基础到实践,深入学习。无论你是初学者还是经验丰富的老手,对于本专栏案例和项目实践都有参考学习意义。 ✨✨✨ 每一个案例都附带关键代码,详细讲解供大家学习,希望…

时间序列分析实战(六):ARIMA乘法(疏系数)模型建模及预测

&#x1f349;CSDN小墨&晓末:https://blog.csdn.net/jd1813346972 个人介绍: 研一&#xff5c;统计学&#xff5c;干货分享          擅长Python、Matlab、R等主流编程软件          累计十余项国家级比赛奖项&#xff0c;参与研究经费10w、40w级横向 文…

HarmonyOS—低代码开发Demo示例

接下来为大家展示一个低代码开发的JS工程的Demo示例&#xff0c;使用低代码开发如下华为手机介绍列表的HarmonyOS应用/服务示例。 1.删除模板页面中的控件后&#xff0c;选中组件栏中的List组件&#xff0c;将其拖至中央画布区域&#xff0c;松开鼠标&#xff0c;实现一个List组…