如何解决 Stripe xamarin 绑定错误? (CS0103 当前上下文中不存在名称“开始”)
Posted
技术标签:
【中文标题】如何解决 Stripe xamarin 绑定错误? (CS0103 当前上下文中不存在名称“开始”)【英文标题】:How to resolve error on Stripe xamarin binding? (CS0103 The name 'Start' does not exist in the current context) 【发布时间】:2019-12-21 13:52:18 【问题描述】:我正在尝试为 Stripe android SDK 创建一个新的绑定,因为那里的绑定已经过时并且缺少 SCA 身份验证,这是最近发布的一项新功能,欧盟市场将需要该功能。
条带信息:https://stripe.com/docs/mobile/android 条带存储库:https://github.com/stripe/stripe-android
我正在使用今天可用的最后一个版本,10.2.1,我只剩下一个错误:
错误 CS0103 当前上下文中不存在名称“Start”
我有一些为 Android 制作绑定的经验,但这个很难解决:
如果我转到报告错误的自动生成类 -PaymentAuthWebViewStarter- 我可以看到:
// This method is explicitly implemented as a member of an instantiated Com.Stripe.Android.View.IAuthActivityStarter
void global::Com.Stripe.Android.View.IAuthActivityStarter.Start (global::Java.Lang.Object p0)
Start (global::Java.Interop.JavaObjectExtensions.JavaCast<global::Com.Stripe.Android.PaymentAuthWebViewStarter.Data>(p0));
但是那里没有 Start 的代码。这是预期的,因为 api.xml 向我显示了该类的以下代码:
<class abstract="false" deprecated="not deprecated" extends="java.lang.Object" extends-generic-aware="java.lang.Object" jni-extends="Ljava/lang/Object;" final="false" name="PaymentAuthWebViewStarter" static="false" visibility="public" jni-signature="Lcom/stripe/android/PaymentAuthWebViewStarter;">
<implements name="com.stripe.android.view.AuthActivityStarter" name-generic-aware="com.stripe.android.view.AuthActivityStarter<com.stripe.android.PaymentAuthWebViewStarter.Data>" jni-type="Lcom/stripe/android/view/AuthActivityStarter<Lcom/stripe/android/PaymentAuthWebViewStarter$Data;>;">
</implements>
<field deprecated="not deprecated" final="true" name="EXTRA_AUTH_URL" jni-signature="Ljava/lang/String;" static="true" transient="false" type="java.lang.String" type-generic-aware="java.lang.String" value=""auth_url"" visibility="public" volatile="false">
</field>
<field deprecated="not deprecated" final="true" name="EXTRA_CLIENT_SECRET" jni-signature="Ljava/lang/String;" static="true" transient="false" type="java.lang.String" type-generic-aware="java.lang.String" value=""client_secret"" visibility="public" volatile="false">
</field>
<field deprecated="not deprecated" final="true" name="EXTRA_RETURN_URL" jni-signature="Ljava/lang/String;" static="true" transient="false" type="java.lang.String" type-generic-aware="java.lang.String" value=""return_url"" visibility="public" volatile="false">
</field>
<field deprecated="not deprecated" final="true" name="EXTRA_UI_CUSTOMIZATION" jni-signature="Ljava/lang/String;" static="true" transient="false" type="java.lang.String" type-generic-aware="java.lang.String" value=""ui_customization"" visibility="public" volatile="false">
</field>
</class>
如您所见,没有任何 Start 方法的踪迹。接口已声明并具有预期的 Start 方法签名,如下所示:
<interface abstract="true" deprecated="not deprecated" final="false" name="AuthActivityStarter" static="false" visibility="public" jni-signature="Lcom/stripe/android/view/AuthActivityStarter;">
<typeParameters>
<typeParameter name="StartDataType" classBound="java.lang.Object" jni-classBound="Ljava/lang/Object;"></typeParameter>
</typeParameters>
<method abstract="true" deprecated="not deprecated" final="false" name="start" jni-signature="(Ljava/lang/Object;)V" bridge="false" native="false" return="void" jni-return="V" static="false" synchronized="false" synthetic="false" visibility="public">
<parameter name="p0" type="StartDataType" jni-type="TStartDataType;">
</parameter>
</method>
</interface>
另一方面,如果我使用 JD-GUI(java 反编译器)查看 .aar 类,我可以看到 Start 是在 PaymentAuthWebViewStarter 类中定义的:
public void start(@NonNull Data data)
Bundle extras = new Bundle();
extras.putString("client_secret", data.mClientSecret);
extras.putString("auth_url", data.mUrl);
extras.putString("return_url", data.mReturnUrl);
extras.putParcelable("ui_customization", this.mToolbarCustomization);
this.mHost.startActivityForResult(PaymentAuthWebViewActivity.class, extras, this.mRequestCode);
我的问题是:
为什么这个方法没有像任何其他类中的任何其他方法一样生成?
如何解决这个问题?
我已将代码留在这里:https://github.com/guillermo-gerard/stripe.android.sdk.binding/tree/master 非常欢迎您分叉并尝试解决此问题。
【问题讨论】:
【参考方案1】:好吧,在再挣扎一点之后,我会解决我的问题,但我还不确定为什么会发生这种情况。
更改已在 repo 中发布,但以防万一它对任何人都有帮助:我必须在 Additions 中添加一个部分类来实现对丢失成员的调用,如下所示:
namespace Com.Stripe.Android
// This class fixes the Error CS0103 The name 'Start' does not exist in the current context
public partial class PaymentAuthWebViewStarter : global::Java.Lang.Object
internal new static readonly JniPeerMembers _members1 = new XAPeerMembers("com/stripe/android/PaymentAuthWebViewStarter", typeof(PaymentAuthWebViewStarter));
// Metadata.xml XPath method reference: path="/api/package[@name='com.stripe.android']/class[@name='PaymentAuthWebViewStarter']/method[@name='start' and count(parameter)=1 and parameter[1][@type='com.stripe.android.PaymentAuthWebViewStarter.Data']]"
[Register("start", "(Lcom/stripe/android/PaymentAuthWebViewStarter$Data;)V",
"GetStart_Lcom_stripe_android_PaymentAuthWebViewStarter_Data_Handler")]
public virtual unsafe void Start(global::Com.Stripe.Android.PaymentAuthWebViewStarter.Data data)
const string __id = "start.(Lcom/stripe/android/PaymentAuthWebViewStarter$Data;)V";
try
JniArgumentValue* __args = stackalloc JniArgumentValue[1];
__args[0] = new JniArgumentValue(
(data == null) ? IntPtr.Zero : ((global::Java.Lang.Object) data).Handle);
_members1.InstanceMethods.InvokeVirtualVoidMethod(__id, this, __args);
finally
就是这样,这解决了编译问题,我已经能够生成 dll。 将其包含在项目中后,会出现新的错误,但现在已解决。
免责声明:我还没有完全测试绑定,我只确定它可以包含在项目中,并且可以使用条纹小部件输入信用卡信息。我还没有测试 SCA 行为和 3DS 身份验证。因此,如果您要使用此绑定,请对其进行全面测试,如果出现任何问题,请告诉我
【讨论】:
【参考方案2】:您要为 ios 创建绑定吗?
【讨论】:
嗨,保罗,很遗憾,暂时没有。我不需要这个项目的 iOS 绑定。 正常吗?您使用的是 Xamarin.Forms 还是 Xamarin.Droid? 嗨,保罗,到目前为止它工作得很好。我没有为这个项目使用表单以上是关于如何解决 Stripe xamarin 绑定错误? (CS0103 当前上下文中不存在名称“开始”)的主要内容,如果未能解决你的问题,请参考以下文章
Xamarin.Forms Tapped 事件,没有可绑定的属性
如何在 Xamarin 表单中将数组绑定到 ListView