【问题标题】:Xamarin Forms -> System.MissingMethodException: Default constructor not found for [Interface]Xamarin 表单-> System.MissingMethodException:未找到 [Interface] 的默认构造函数
【发布时间】:2021-01-03 07:17:29
【问题描述】:

我在 Xamarin.Forms 上使用依赖服务时收到此错误。我已经看到涉及 iOS 和链接器的此错误的答案。但是,我在 Android 上运行它并且链接器已关闭。

它告诉我的构造函数在 PCL 中找不到接口的默认构造函数。

我已经搜索和调试了几个小时。有哪些可能会导致此错误?我很确定我的 DependencyService 实现是正确的,所以我觉得它有所不同。

这是我的相关代码。

安卓

[assembly: Xamarin.Forms.Dependency(typeof(TextRecognition))]
namespace DiabetesAPP.Droid
{
    [Preserve(AllMembers = true)]
    [Activity(Label = "TextRecognition", Theme = "@style/Theme.AppCompat.Light.NoActionBar", MainLauncher = true)]
    public class TextRecognition : AppCompatActivity, ISurfaceHolderCallback, IProcessor, ITextRecognition
    {
        private SurfaceView cameraView;
        private TextView textView;
        private CameraSource cameraSource;
        public string Resultados;
        private const int RequestCameraPermissionID = 1001;

        protected override void OnCreate(Bundle savedInstanceState)
        {

            base.OnCreate(savedInstanceState);

            SetContentView(Resource.Layout.Main);
            cameraView = FindViewById<SurfaceView>(Resource.Id.surface_view);
            textView = FindViewById<TextView>(Resource.Id.txtview);

            TextRecognizer textRecognizer = new TextRecognizer.Builder(ApplicationContext).Build();
            if (!textRecognizer.IsOperational)
            {
                Log.Error("Main Activity", "Detector dependencies are not yet available");
            }
            else
            {
                cameraSource = new CameraSource.Builder(ApplicationContext, textRecognizer)
                    .SetFacing(CameraFacing.Back)
                    .SetRequestedFps(2.0f)
                    .SetRequestedPreviewSize(1280, 1024)
                    .SetAutoFocusEnabled(true)
                    .Build();

                cameraView.Holder.AddCallback(this);
                 textRecognizer.SetProcessor(this);
            }

            Android.Widget.Button logonButton = FindViewById<Android.Widget.Button>(Resource.Id.button_send);
            logonButton.Click += LogonButton_Click;
        }

        public override void OnRequestPermissionsResult(int requestCode, string[] permissions, [GeneratedEnum] Android.Content.PM.Permission[] grantResults)
        {
            switch (requestCode)
            {
                case RequestCameraPermissionID:
                    {
                        if (grantResults[0] == Android.Content.PM.Permission.Granted)
                        {
                           cameraSource.Start(cameraView.Holder);
                        }
                    }
                    break;
            }
        }

        public void SurfaceChanged(ISurfaceHolder holder, [GeneratedEnum] Format format, int width, int height)
        {

        }

        public void SurfaceCreated(ISurfaceHolder holder)
        {
            if (ActivityCompat.CheckSelfPermission(ApplicationContext, Manifest.Permission.Camera) != Android.Content.PM.Permission.Granted)
            {
                ActivityCompat.RequestPermissions(this, new string[]
                {
                    Android.Manifest.Permission.Camera
                }, RequestCameraPermissionID);
                return;
            }
           cameraSource.Start(cameraView.Holder);
        }

        public void SurfaceDestroyed(ISurfaceHolder holder)
        {
            cameraSource.Stop();
        }

        public void ReceiveDetections(Detections detections)
        {
            SparseArray items = detections.DetectedItems;
            if (items.Size() != 0)
            {
                textView.Post(() =>
                {
                    StringBuilder strBuilder = new StringBuilder();
                    for (int i = 0; i < items.Size(); i++)
                    {
                        strBuilder.Append(((TextBlock)items.ValueAt(i)).Value);
                        strBuilder.Append("\n");
                    }
                    textView.Text = strBuilder.ToString();
                    Resultados = strBuilder.ToString();
                });
            }
        }

        private void LogonButton_Click(object sender, EventArgs e)
        {
            //Toast.MakeText(this, "Hello from " + Resultados, ToastLength.Long).Show();
            //Intent data = new Intent(this, typeof(TextRecognition));
            //SetResult(Result.Ok, data);
            //// MessagingCenter.Send((DiabetesAPP.App)Xamarin.Forms.Application.Current, "OpenPage", "You send message:" + Resultados);
            //// MessagingCenter.Send<DiabetesAPP.App, string>(DiabetesAPP.App.Current as App, "OpenPage", "You send message:" + Resultados);
            //MessagingCenter.Send((DiabetesAPP.App)Xamarin.Forms.Application.Current, "OpenPage", "You send message:" + Resultados);
            Toast.MakeText(this, Resultados, ToastLength.Short).Show();

            MessagingCenter.Send<App, string>(App.Current as App, "OpenPage", "You send message:" + Resultados);


            Finish();
        }

        public void Release()
        {

        }

        public void LaunchActivityInAndroid()
        {
            Activity activity = Forms.Context as Activity;
            var intent = new Intent(Forms.Context, typeof(TextRecognition));
            activity.StartActivity(intent);
        }

        protected override void OnActivityResult(int requestCode, Result resultCode, Intent data)
        {
            base.OnActivityResult(requestCode, resultCode, data);


            switch (resultCode)
            {
                case Result.Ok:
                    break;
            }

            Finish();
        }



        public interface ITextRecognition
        {

        }

//Update code - 16/09/2020
        public TextRecognition()
        {

        }


    }
}

在 Xamarin.Form 页面中的实现

[assembly: Xamarin.Forms.Dependency(typeof(ITextRecognition))]
namespace DiabetesAPP.Views.FoodMenu
{

    [XamlCompilation(XamlCompilationOptions.Compile)]
    public partial class FoodMenu : ContentPage
    {
        public FoodMenu()
        {
            InitializeComponent();
        }

        async void Food_ManualEntry(object sender, EventArgs e)
        {
            await Navigation.PushAsync(new SearchFood());
        }

        public void Food_CameraEntry(object sender, EventArgs e)
        {
            Xamarin.Forms.DependencyService.Register<ITextRecognition>();
            DependencyService.Get<ITextRecognition>().LaunchActivityInAndroid();

        }

        public interface ITextRecognition
        {
            void LaunchActivityInAndroid();
        }

    }
}

错误:System.MissingMethodException:找不到类型 DiabetesAPP.Views.FoodMenu.FoodMenu+ITextRecognition 的默认构造函数

出了什么问题?

【问题讨论】:

  • 如果您只向 TextRecognition 类添加一个空的构造函数会发生什么?
  • @SomeStudent 什么都没有...同样的错误
  • 我的解决方案对您有用吗?如果是,请您接受(点击此答案左上角的☑️),以便我们可以帮助更多有相同问题的人:)。

标签: c# android xamarin xamarin.forms xamarin.android


【解决方案1】:

这正是错误所说的。对于DependencyService 实例化一个类,类必须 有一个默认(空)构造函数。你的没有。

【讨论】:

  • 这就是 SomeStudent 上面给我的解决方案......它不起作用:(我更新了我的代码
  • 为什么要在 FoodMenu 中注册? FoodMenu 不是 ITextRecognition 的实现类。
  • 我以为我必须调用它...但我删除了它,它给出了同样的错误
  • 你的 [Assembly] 属性也放错了地方——它属于实现接口的类
【解决方案2】:

你不需要在Android项目中创建一个新的ITextRecognition接口,你应该使用你在Xamarin.forms项目中创建的接口。

另外,最好不要在 FoodMenu 类中创建接口。

下面是代码示例:

在 Xamarin.Forms 中:

namespace App384
{
    [XamlCompilation(XamlCompilationOptions.Compile)]
    public partial class FoodMenu : ContentPage
    {
        public FoodMenu()
        {
            InitializeComponent();
        }

        public void Food_CameraEntry(object sender, EventArgs e)
        {
            Xamarin.Forms.DependencyService.Register<ITextRecognition>();
            DependencyService.Get<ITextRecognition>().LaunchActivityInAndroid();

        }
    }

    public interface ITextRecognition
    {
        void LaunchActivityInAndroid();
    }
}

在 Xamarin.Android 项目中:

[assembly: Xamarin.Forms.Dependency(typeof(TextRecognition))]
namespace App384.Droid
{
    [Preserve(AllMembers = true)]
    [Activity(Label = "TextRecognition", Theme = "@style/Theme.AppCompat.Light.NoActionBar", MainLauncher = true)]
    public class TextRecognition : AppCompatActivity, ITextRecognition
    {
        protected override void OnCreate(Bundle savedInstanceState)
        {
            base.OnCreate(savedInstanceState);
        }

        public void LaunchActivityInAndroid()
        {
            Console.WriteLine("LaunchActivityInAndroid");
        }

    }
}

我已上传test demo here,您可以查看。

参考:Xamarin.Forms DependencyService Introduction

【讨论】:

    猜你喜欢
    • 2016-11-15
    • 1970-01-01
    • 2018-08-10
    • 2014-06-28
    • 2017-02-28
    • 2020-07-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多