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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.28 04:12:53