You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Xamarin中Google.Guava冲突及Firestore读取空引用异常求助

两个问题求助:Guava库冲突与Firestore读取崩溃

一、Guava库冲突错误

错误信息:

发现文件名相同但内容不同的JAR库引用:__reference__guava.jar,请从EmbeddedJar、InputJar和AndroidJavaLibrary中移除冲突库。Food_Recipe_App.Android

为解决之前的System.NullReferenceException(对象引用未设置为对象的实例),尝试引入了Xamarin.Google.Guava,但现在出现上述库冲突问题,不知如何解决。

二、Firestore.Read()调用后程序崩溃

触发崩溃的页面代码(OnAppearing方法):

protected override async void OnAppearing()
{
    base.OnAppearing();

    //using (SQLiteConnection conn = new SQLiteConnection(App.DatabaseLocation))
    //{
    //    conn.CreateTable<Recipe>();
    //    var recipes = conn.Table<Recipe>().ToList();
    //    //recipeListView.ItemsSource = recipes;
    //};

    var recipes = await Firestore.Read(); // 此行导致崩溃
    //assignRecipesToDays(recipes);
}

Firestore的Read方法实现:

public async Task<List<Recipe>> Read()
{
    try
    {
        hasReadRecipes = false;
        var collection = FirebaseFirestore.Instance.Collection("recipes");

        var query = collection.WhereEqualTo("userId", FirebaseAuth.Instance.CurrentUser.Uid);

        query.Get().AddOnCompleteListener(this);

        for (int i = 0; i < 50; i++)
        {
            await System.Threading.Tasks.Task.Delay(100);
            if (hasReadRecipes)
                break;
        }

        return recipes;
    }
    catch (Exception ex)
    {
        return recipes;
    }
}

完整Firestore类代码:

using Android.App;
using Android.Content;
using Android.Gms.Tasks;
using Android.OS;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Firebase.Auth;
using Firebase.Firestore;
using Food_Recipe_App.Assets.Classes;
using Food_Recipe_App.Helpers;
using Java.Interop;
using Java.Util;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Xamarin.Forms;

[assembly: Dependency(typeof(Food_Recipe_App.Droid.Dependencies.Auth))]
namespace Food_Recipe_App.Droid.Dependencies
{

    public class Firestore : Java.Lang.Object, IFirestore, IOnCompleteListener
    {
        List<Recipe> recipes;
        bool hasReadRecipes = false;

        public Firestore()
        {
            recipes = new List<Recipe>();
        }

        public async Task<bool> Delete(Recipe recipe)
        {
            try
            {
                var collection = FirebaseFirestore.Instance.Collection("recipes");
                collection.Document(recipe.Id).Delete();
                return true;
            }
            catch (Exception ex)
            {
                return false;
            }
        }

        public async Task<bool> Insert(Recipe recipe)
        {
            try
            {
                var recipeDocument = new Dictionary<string, Java.Lang.Object>()
                {
                    { "title", recipe.title },
                    { "description", recipe.description },
                    { "creatorUserId", FirebaseAuth.Instance.CurrentUser.Uid }
                };

                var collection = Firebase.Firestore.FirebaseFirestore.Instance.Collection("recipes");
                collection.Add(new HashMap(recipeDocument));

                return true;
            } 
            catch (Exception ex)
            {
                return false;
            }
        }

        public void OnComplete(Android.Gms.Tasks.Task task)
        {
            if (task.IsSuccessful)
            {
                var documents = (QuerySnapshot)task.Result;

                recipes.Clear();
                foreach (var doc in documents.Documents)
                {
                    Recipe newRecipe = new Recipe()
                    {
                        title = doc.Get("title").ToString(),
                        description = doc.Get("description").ToString(),
                        Id = doc.Id
                    };

                    recipes.Add(newRecipe);
                }
            }
            else
            {
                recipes.Clear();
            }

            hasReadRecipes = true;
        }

        public async Task<List<Recipe>> Read()
        {
            try
            {
                hasReadRecipes = false;
                var collection = FirebaseFirestore.Instance.Collection("recipes");

                var query = collection.WhereEqualTo("userId", FirebaseAuth.Instance.CurrentUser.Uid);

                query.Get().AddOnCompleteListener(this);

                for (int i = 0; i < 50; i++)
                {
                    await System.Threading.Tasks.Task.Delay(100);
                    if (hasReadRecipes)
                        break;
                }

                return recipes;
            }
            catch (Exception ex)
            {
                return recipes;
            }
        }

        public async Task<bool> Update(Recipe recipe)
        {
            try
            {
                var recipeDocument = new Dictionary<string, Java.Lang.Object>()
                {
                    { "title", recipe.title },
                    { "description", recipe.description },
                    { "creatorUserId", FirebaseAuth.Instance.CurrentUser.Uid }
                };

                var collection = FirebaseFirestore.Instance.Collection("recipes");
                collection.Document(recipe.Id).Update(recipeDocument);

                return true;
            }
            catch (Exception ex)
            {
                return false;
            }
        }
    }
}

内容的提问来源于stack exchange,提问作者Noah Smedberg

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 13:27:19