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

Flutter Cognito获取用户属性iOS端顺序不一致问题求助

原因分析

Android和iOS平台的Amplify Auth SDK底层实现存在差异:

  • Android端SDK返回用户属性时,会按照固定顺序(比如Cognito用户池定义属性的顺序)排列成数组返回。
  • iOS端SDK则是从无序的键值对集合(比如字典)转换为数组返回,集合本身没有固定顺序,所以每次调用返回的数组顺序都会随机变化。
解决方法

不要依赖数组下标获取属性值,而是根据属性名称匹配取值,这是更健壮的实现方式,能彻底解决跨平台顺序不一致的问题。

修改后的代码示例:

Future<void> fetchCurrentUserAttributes() async {
  try {
    final result = await Amplify.Auth.fetchUserAttributes();
    // 将属性列表转换为以属性名为key的Map
    final userAttrs = {
      for (final attr in result) attr.userAttributeKey.key: attr.value,
    };
    // 通过属性名直接获取对应值
    print('sub: ${userAttrs['sub']}');
    print('synchronized: ${userAttrs['synchronized']}');
    print('id: ${userAttrs['id']}');
    print('email: ${userAttrs['email']}');
    
    // 按自定义固定顺序构建数组供其他函数使用
    final orderedAttrs = [
      userAttrs['sub'],
      userAttrs['synchronized'],
      userAttrs['id'],
      userAttrs['email'],
    ];
    // 后续直接使用orderedAttrs即可,顺序始终固定
  } on AuthException catch (e) {
    print(e.message);
  }
}

额外说明

这种方式不仅解决了跨平台顺序不一致的问题,还能避免因用户属性增删、SDK版本更新导致的下标错位问题,代码的可维护性和稳定性更高。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 13:05:42