fluwx官方链接:https://pub.dev/packages/fluwx
import 'package:flutter/material.dart';
//微信支付回调
responseFromPayment.listen((WeChatPaymentResponse event){
});
//微信分享回调
responseFromShare.listen((WeChatShareResponse event){
});
只看实现方式,看到这里就好了,以下为本人查询该问题全过程。
官方文档没有找到fluwx分享后的回调(可能是我没找到),于是去看微信官方文档(https://developers.weixin.qq.com/doc/oplatform/Mobile_App/Access_Guide/Android.html安卓接入指南)
[4] 接收微信的请求及返回值
如果你的程序需要接收微信发送的请求,或者接收发送到微信请求的响应结果,需要下面 3 步操作:
a. 在你的包名相应目录下新建一个 wxapi 目录,并在该 wxapi 目录下新增一个 WXEntryActivity 类
b. 实现 IWXAPIEventHandler 接口,微信发送的请求将回调到 onReq 方法,发送到微信请求的响应结果将回调到 onResp 方法
c. 在 WXEntryActivity 中将接收到的 intent 及实现了 IWXAPIEventHandler 接口的对象传递给 IWXAPI 接口的 handleIntent 方法,示例如下图:
api.handleIntent(getIntent(), this);
当微信发送请求到你的应用,将通过 IWXAPIEventHandler 接口的 onReq 方法进行回调,类似的,应用请求微信的响应结果将通过 onResp 回调。
但是我的WXEntryActivity并没有实现IWXAPIEventHandler接口,但是fluwx文档中提到,可以直接继承FluwxWXEntryActivity来实现。所以打开FluwxWXEntryActivity。
/* * Copyright (C) 2018 The OpenFlutter Organization * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ package com.jarvan.fluwx.wxapi import android.app.Activity import android.content.Intent import android.os.Bundle import com.jarvan.fluwx.handler.FluwxRequestHandler import com.jarvan.fluwx.handler.FluwxResponseHandler import com.jarvan.fluwx.handler.WXAPiHandler import com.tencent.mm.opensdk.modelbase.BaseReq import com.tencent.mm.opensdk.modelbase.BaseResp import com.tencent.mm.opensdk.openapi.IWXAPIEventHandler open class FluwxWXEntryActivity : Activity(), IWXAPIEventHandler { // IWXAPI 是第三方app和微信通信的openapi接口 public override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) try { WXAPiHandler.wxApi?.handleIntent(intent, this) } catch (e: Exception) { e.printStackTrace() finish() } } override fun onNewIntent(intent: Intent) { super.onNewIntent(intent) setIntent(intent) try { WXAPiHandler.wxApi?.handleIntent(intent, this) } catch (e: Exception) { e.printStackTrace() finish() } } override fun onReq(baseReq: BaseReq) { // FIXME: 可能是官方的Bug,从微信拉起APP的Intent类型不对,无法跳转回Flutter Activity // 稳定复现场景:微信版本为7.0.5,小程序SDK为2.7.7 val activity = FluwxRequestHandler.getRegistrar()?.activity() if (baseReq.type == 4 && activity is Activity) { // com.tencent.mm.opensdk.constants.ConstantsAPI.COMMAND_SHOWMESSAGE_FROM_WX = 4 startActivity(Intent(this, activity::class.java)) finish() } } // 第三方应用发送到微信的请求处理后的响应结果,会回调到该方法 override fun onResp(resp: BaseResp) { FluwxResponseHandler.handleResponse(resp) finish() } }
onResp上面注释的很明白。其实现在如果只是想实现android 层的就已经结束了,直接在自己的WXEntryActivity中重写onResp方法,按照项目业务逻辑操作就好了。
由于我们公司需要对应android和ios两个平台,所以还是要确认一下,fluwx如果有内部回调接口则说明是两个平台统一一个方法回调,如果没有则需要针对不同平台处理。带着这个问题开始从源头查起。
首先确定插件交互名称。
public final class GeneratedPluginRegistrant { public static void registerWith(PluginRegistry registry) { if (alreadyRegisteredWith(registry)) { return; } FluwxPlugin.registerWith(registry.registrarFor("com.jarvan.fluwx.FluwxPlugin")); } }
class FluwxPlugin(private val registrar: Registrar, channel: MethodChannel) : MethodCallHandler { companion object { @JvmStatic fun registerWith(registrar: Registrar): Unit { val channel = MethodChannel(registrar.messenger(), "com.jarvanmo/fluwx") } } }
找到MethodChannel后在flutter项目中全局检索"com.jarvanmo/fluwx"(如果这块不清楚先去看dart与android之间的交互)找到
fluwx_iml.dart,贴出一部分代码,这是fluwx库的入口,有兴趣的可以详细看一下。
StreamController<WeChatShareResponse> _responseShareController = new StreamController.broadcast(); /// Response from share Stream<WeChatShareResponse> get responseFromShare => _responseShareController.stream; StreamController<WeChatAuthResponse> _responseAuthController = new StreamController.broadcast(); /// Response from auth Stream<WeChatAuthResponse> get responseFromAuth => _responseAuthController.stream; StreamController<WeChatPaymentResponse> _responsePaymentController = new StreamController.broadcast(); ///Response from payment Stream<WeChatPaymentResponse> get responseFromPayment => _responsePaymentController.stream; Stream<WeChatLaunchMiniProgramResponse> get responseFromLaunchMiniProgram => _responseLaunchMiniProgramController.stream; ///Response from launching mini-program StreamController<WeChatLaunchMiniProgramResponse> _responseLaunchMiniProgramController = new StreamController.broadcast(); StreamController<WeChatSubscribeMsgResp> _responseFromSubscribeMsg = new StreamController.broadcast(); ///Response from subscribing micro-message Stream<WeChatSubscribeMsgResp> get responseFromSubscribeMsg => _responseFromSubscribeMsg.stream; StreamController<AuthByQRCodeResult> _authByQRCodeFinishedController = new StreamController.broadcast(); ///invoked when [authByQRCode] finished Stream<AuthByQRCodeResult> get onAuthByQRCodeFinished => _authByQRCodeFinishedController.stream; StreamController<Uint8List> _onAuthGotQRCodeController = new StreamController.broadcast(); ///when QRCode received Stream<Uint8List> get onAuthGotQRCode => _onAuthGotQRCodeController.stream; StreamController _onQRCodeScannedController = new StreamController(); ///after uer scanned the QRCode you just received Stream get onQRCodeScanned => _onQRCodeScannedController.stream; StreamController<WeChatAutoDeductResponse> _responseAutoDeductController = new StreamController.broadcast(); /// Response from AutoDeduct Stream<WeChatAutoDeductResponse> get responseFromAutoDeduct => _responseAutoDeductController.stream; final MethodChannel _channel = const MethodChannel('com.jarvanmo/fluwx') ..setMethodCallHandler(_handler); Future<dynamic> _handler(MethodCall methodCall) { if ("onShareResponse" == methodCall.method) { _responseShareController.sink .add(WeChatShareResponse.fromMap(methodCall.arguments)); } else if ("onAuthResponse" == methodCall.method) { _responseAuthController.sink .add(WeChatAuthResponse.fromMap(methodCall.arguments)); } else if ("onLaunchMiniProgramResponse" == methodCall.method) { _responseLaunchMiniProgramController.sink .add(WeChatLaunchMiniProgramResponse.fromMap(methodCall.arguments)); } else if ("onPayResponse" == methodCall.method) { _responsePaymentController.sink .add(WeChatPaymentResponse.fromMap(methodCall.arguments)); } else if ("onSubscribeMsgResp" == methodCall.method) { _responseFromSubscribeMsg.sink .add(WeChatSubscribeMsgResp.fromMap(methodCall.arguments)); } else if ("onAuthByQRCodeFinished" == methodCall.method) { _handleOnAuthByQRCodeFinished(methodCall); } else if ("onAuthGotQRCode" == methodCall.method) { _onAuthGotQRCodeController.sink.add(methodCall.arguments); } else if ("onQRCodeScanned" == methodCall.method) { _onQRCodeScannedController.sink.add(null); } else if ("onAutoDeductResponse" == methodCall.method) { _responseAutoDeductController.sink .add(WeChatAutoDeductResponse.fromMap(methodCall.arguments)); } return Future.value(true); }
标注的看命名可以猜到是有关分享相应的,然后点进new StreamController.broadcast()一看。
/** * A controller where [stream] can be listened to more than once. * * The [Stream] returned by [stream] is a broadcast stream. * It can be listened to more than once. * * A Stream should be inert until a subscriber starts listening on it (using * the [onListen] callback to start producing events). Streams should not * leak resources (like websockets) when no user ever listens on the stream. * * Broadcast streams do not buffer events when there is no listener. * * The controller distributes any events to all currently subscribed * listeners at the time when [add], [addError] or [close] is called. * It is not allowed to call `add`, `addError`, or `close` before a previous * call has returned. The controller does not have any internal queue of * events, and if there are no listeners at the time the event is added, * it will just be dropped, or, if it is an error, be reported as uncaught. * * Each listener subscription is handled independently, * and if one pauses, only the pausing listener is affected. * A paused listener will buffer events internally until unpaused or canceled. * * If [sync] is true, events may be fired directly by the stream's * subscriptions during an [add], [addError] or [close] call. * The returned stream controller is a [SynchronousStreamController], * and must be used with the care and attention necessary to not break * the [Stream] contract. * See [Completer.sync] for some explanations on when a synchronous * dispatching can be used. * If in doubt, keep the controller non-sync. * * If [sync] is false, the event will always be fired at a later time, * after the code adding the event has completed. * In that case, no guarantees are given with regard to when * multiple listeners get the events, except that each listener will get * all events in the correct order. Each subscription handles the events * individually. * If two events are sent on an async controller with two listeners, * one of the listeners may get both events * before the other listener gets any. * A listener must be subscribed both when the event is initiated * (that is, when [add] is called) * and when the event is later delivered, * in order to receive the event. * * The [onListen] callback is called when the first listener is subscribed, * and the [onCancel] is called when there are no longer any active listeners. * If a listener is added again later, after the [onCancel] was called, * the [onListen] will be called again. */ factory StreamController.broadcast( {void onListen(), void onCancel(), bool sync: false}) { return sync ? new _SyncBroadcastStreamController<T>(onListen, onCancel) : new _AsyncBroadcastStreamController<T>(onListen, onCancel); }
如果不明白,直接有道翻译注释。
最后也是尝试性的导入fluwx包后,输入respon就出来了很多提示!!!
找到responseFromShare.listen,参数一目了然
赶紧测试验证,统统通过,完成。
第一次写,纯属个人纪录。如果有人能看到并帮助到了你,那是意外收获,不谢。