【问题标题】:Why list.length returns 1 size if no elements are present如果没有元素存在,为什么 list.length 返回 1 大小
【发布时间】:2021-05-30 10:47:59
【问题描述】:

我在返回列表大小时遇到​​了一个奇怪的问题。 服务器有 List<String> 作为返回类型。作为对颤振请求的响应,我得到了字符串。

I/flutter ( 4454): ["Email is already taken","Phone number is already taken","Username is already taken"]
I/flutter ( 4454): [Email is already taken, Phone number is already taken, Username is already taken]
I/flutter ( 4454): 3
I/flutter ( 4454): false

所以我将其转换为列表,删除 "[] 像这样:

 print(response.body);
    List<String> list = response.body
        .substring(1, response.body.length - 1)
        .replaceAll('"', '')
        .split(',')
        .toList();

 print(list);
    print(list.length);
    print(list.length == 0);

这里一切都是正确的,但是当我没有错误时(打印后):

I/flutter ( 4454): []
I/flutter ( 4454): []
I/flutter ( 4454): 1
I/flutter ( 4454): false

尽管列表没有元素,但它返回 1 大小。

你能告诉我我做错了什么吗?还有为什么 server 端返回 List&lt;String&gt; 时 response.body 包含 String ?

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    您的列表确实包含一个元素,即空的String,其值为:''。打印列表时看不到它的原因是因为 Dart 在打印字符串时没有向字符串添加任何内容(例如,用 "" 封装它)。

    我们可以在这个例子中看到这一点:

    void main() {
      final list = [''];
      print(list); // []
    
      for (var i = 0; i < list.length; i++) {
        print('$i = ${list[i]}'); // 0 = 
      }
    }
    

    在我看来,您正在尝试手动解析一些 JSON。你可以在你的例子中做这样的事情,而不是自己做:

    import 'dart:convert';
    
    void main() {
      const input = r'["Email is already taken","Phone number is already taken","Username is already taken"]';
      print(parseJsonList(input));
      // [Email is already taken, Phone number is already taken, Username is already taken]
    }
    
    List<String> parseJsonList(String json) =>
        (jsonDecode(json) as List<dynamic>).cast<String>();
    

    【讨论】:

    • 但如果我改为.substring(0....),那么如果列表包含一些元素,我有双'[' = [[电子邮件已被占用,电话号码已被占用,用户名已被占用]`跨度>
    • 好的,这部分不能帮你。问题是为什么一个看似空的列表会有一个长度。 :)
    • 好的。但是为什么我有这个空字符串?我不明白。 Ahmed Raza 的回答无效。
    • @traki111 有什么理由让您自己进行解析而不是仅使用 JSON 解析器进行解码?
    • 因为 json.decode 返回List&lt;dynamic&gt; 并且非常不方便。有没有更好的解码器?
    【解决方案2】:

    将此.substring(1, response.body.length - 1) 更改为.substring(0, response.body.length - 1)

    【讨论】:

      猜你喜欢
      • 2015-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-05
      • 1970-01-01
      • 1970-01-01
      • 2019-06-08
      相关资源
      最近更新 更多