如何使用Xamarin.Auth存储凭证并持续向列表添加数据?
解决卡片凭证无法累加存储的问题
我懂你的痛点——每次添加新卡片时旧数据都会被覆盖,没法把所有卡片都保留下来对吧?问题出在你当前的AddCard方法里:每次调用它都会创建一个全新的Account对象,然后直接用Save方法覆盖掉同服务名"Credentials"下的旧账户,自然就看不到之前的卡片了。
咱们可以通过存储卡片列表的方式来解决这个问题,把多张卡片的数据序列化后存在账户里,这样就能实现累加了。下面是具体的修改方案:
第一步:引入JSON序列化工具
你可以用System.Text.Json(.NET Core/.NET 5+自带)或者Newtonsoft.Json来序列化卡片列表,这样就能把多个Info对象存在一个属性里。
第二步:修改AddCard方法,实现数据累加
修改后的方法会先检查是否已有存储的账户:如果有,就取出已有的卡片列表,添加新卡片后再存回去;如果没有,就创建新列表存储第一张卡片。
第三步:修改AddNewCard方法,读取并展示所有卡片
从账户中取出序列化后的列表,反序列化后绑定到ListView,这样就能显示所有卡片了。
修改后的完整代码示例
using System.Collections.Generic; using System.Linq; using System.Text.Json; // 如果用Newtonsoft.Json就替换成using Newtonsoft.Json; async void AddCard(object s, EventArgs e) { var accountStore = AccountStore.Create(); // 先查找已有的账户 var existingAccount = accountStore.FindAccountsForService("Credentials").FirstOrDefault(); List<Info> cardList; if (existingAccount != null && existingAccount.Properties.ContainsKey("CardList")) { // 取出已存储的卡片列表并反序列化 var existingCardsJson = existingAccount.Properties["CardList"]; cardList = JsonSerializer.Deserialize<List<Info>>(existingCardsJson); // Newtonsoft版本替换为:cardList = JsonConvert.DeserializeObject<List<Info>>(existingCardsJson); } else { // 没有账户或没有卡片列表,创建新列表 cardList = new List<Info>(); existingAccount ??= new Account { Username = "Credentials" }; } // 添加新卡片到列表 cardList.Add(new Info { LastFour = LastFourString, CardBrand = BrandString, CardToken = TokenString }); // 序列化列表并存储回账户 var cardsJson = JsonSerializer.Serialize(cardList); // Newtonsoft版本替换为:var cardsJson = JsonConvert.SerializeObject(cardList); existingAccount.Properties["CardList"] = cardsJson; // 保存账户(已有账户会更新,新账户会创建) accountStore.Save(existingAccount, "Credentials"); AddNewCard(); } public class Info { public string LastFour { get; set; } public string CardBrand { get; set; } public string CardToken { get; set; } } async void AddNewCard() { var accountStore = AccountStore.Create(); var existingAccount = accountStore.FindAccountsForService("Credentials").FirstOrDefault(); List<Info> infoList = new List<Info>(); if (existingAccount != null && existingAccount.Properties.ContainsKey("CardList")) { var cardsJson = existingAccount.Properties["CardList"]; infoList = JsonSerializer.Deserialize<List<Info>>(cardsJson); // Newtonsoft版本替换为:infoList = JsonConvert.DeserializeObject<List<Info>>(cardsJson); // 格式化最后四位显示(添加星号前缀) infoList = infoList.Select(card => new Info { LastFour = "**********" + card.LastFour, CardBrand = card.CardBrand, CardToken = card.CardToken }).ToList(); } CardListView.ItemsSource = infoList; }
关键改动说明
- 不再每次创建新
Account覆盖旧数据,而是复用已有账户存储卡片列表 - 用JSON序列化把多张卡片的集合存在一个属性中,实现数据累加
- 在
AddNewCard中反序列化列表,格式化显示后绑定到ListView
这样修改后,每次添加新卡片时,旧的卡片数据都会被保留,ListView里就能显示所有存储的卡片了。
内容的提问来源于stack exchange,提问作者Carlos Rodrigez
相关产品推荐
相关产品推荐

