如何解决 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&lt;com.stripe.android.PaymentAuthWebViewStarter.Data&gt;" jni-type="Lcom/stripe/android/view/AuthActivityStarter&lt;Lcom/stripe/android/PaymentAuthWebViewStarter$Data;&gt;;">
  </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="&quot;auth_url&quot;" 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="&quot;client_secret&quot;" 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="&quot;return_url&quot;" 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="&quot;ui_customization&quot;" 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

Stripe checkout - 如何绑定提交事件?

Xamarin.Forms Android 绑定库错误

Xamarin - 错误构建绑定库 Messaging.g.cs

Xamarin UWP 似乎绑定到错误的视图模型