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
相关产品推荐
相关产品推荐

