首页 > 解决方案 > 导航到注册玩家详细信息屏幕时,在 Xamarin.Forms 中引发对象引用错误

问题描述

单击Register_OnClickedXamarin.Forms 应用程序中的按钮时,系统会抛出System.NullReferenceException: Object reference not set to an instance of an object此按钮将允许应用程序导航到系统保存数据的播放器注册详细信息屏幕。有人可以告知错误的原因吗?我无法弄清楚该错误的原因,已重新启动应用程序,执行clean build操作,但仍然相同。

数据库库使用:sqlite-net-pcl

//MainPage.xaml.cs 详细信息

        public partial class MainPage : ContentPage
            {

                public MainPage()
                {
                    InitializeComponent();

                }


                public async void NavigateButton_OnClicked(object sender, EventArgs e)
                {
                    var tabbedPage = new TabbedPage();
                    tabbedPage.Children.Add(new Home("Welcome"+' '+emailEntry.Text+' '+",have a nice day!"));
                    tabbedPage.Children.Add(new Map());
                    tabbedPage.Children.Add(new Settings());
                    await Navigation.PushAsync(tabbedPage);
                }

                public async void Register_OnClicked(object sender, EventArgs e)
                {
                    await Navigation.PushAsync(new Register());
                }



            }

Register.xaml.cs details 保存 Player 详细信息的地方:

using SQLite;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Xamarin.Forms;
using Xamarin.Forms.Xaml;
using System.Linq;

namespace soccerapp
{
    [XamlCompilation(XamlCompilationOptions.Compile)]
    public partial class Register : ContentPage
    {
        public SQLiteConnection conn;
        public Register()
        {
            InitializeComponent();
            conn = DependencyService.Get<Isqlite>().GetConnection();
            conn.CreateTable<PlayerDetails>();
        }

        public void RegisterSave_OnClicked(object sender, EventArgs e)
        {
            PlayerDetails playerDetails = new PlayerDetails();
            playerDetails.FullName = fullNameEntry.Text;
            playerDetails.Mobile = mobileEntry.Text;
            playerDetails.SoccerPosition = soccerpostionEntry.Text;
            playerDetails.Email = emailRegister.Text;
            playerDetails.Password = passwordEntry.Text;
            int x = 0;
            try
            {
                x = conn.Insert(playerDetails);
            }
            catch (Exception ex)
            {
                throw ex;
            }

            if (x == 1)
            {
                DisplayAlert("Registration", "Player Registered Successfully", "Cancel");
            }
            else
            {
                DisplayAlert("Registration Failled!!!", "Please try again", "ERROR");
            }


        }
    }
}

SQlite Connection 类创建并返回连接:

        public class SQliteDroid : Isqlite
            {
                public SQLiteConnection GetConnection()
                {
                    var dbase = "soccerpep";
                    var dbpath = System.Environment.GetFolderPath(System.Environment.SpecialFolder.ApplicationData);
                    var path = Path.Combine(dbpath, dbase);
                    var connection = new SQLiteConnection(path);
                    return connection;

                }
            }


    [![enter image description here][1]][1]


      [1]: https://i.stack.imgur.com/nZ8GZ.png

来自 Debug > Windows > Call Stack 的错误详细信息添加如下;

    0xFFFFFFFFFFFFFFFF in System.Diagnostics.Debugger.Mono_UnhandledException_internal  C#
        0x1 in System.Diagnostics.Debugger.Mono_UnhandledException  C#
        0x20 in Android.Runtime.DynamicMethodNameCounter.43 C#
        0x12 in System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw    C#
        0x6 in System.Runtime.CompilerServices.AsyncMethodBuilderCore.<>c.<ThrowAsync>b__6_0    C#
        0xC in Android.App.SyncContext. C#
        0xE in Java.Lang.Thread.RunnableImplementor.Run C#
        0xA in Java.Lang.IRunnableInvoker.n_Run C#
        0x11 in Android.Runtime.DynamicMethodNameCounter.43 C#

标签: xamarinxamarin.forms

解决方案


通过注册页面的构造函数和 SqliteDroid 类的 GetConnection 方法进行调试。

当依赖注入失败时,我已经看到了这样难以发现的错误。这可能是因为 GetConnection 中的错误,或者是因为 SqliteDroid 尚未在您的 DependencyService 中注册。


推荐阅读