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

