【问题标题】:Update one List from values another List从另一个列表的值更新一个列表
【发布时间】:2021-10-16 11:33:07
【问题描述】:

我编写了获取 Json 数据并放入 listPc 的代码。并编写了将值“hostName”从 listPc 添加到 pcBusy 列表的循环。但是我的代码只将值添加到第二个列表中,如果我在 pcBusy 列表重复中按 GetButton 值。我需要更新 pcBusy 列表,而不仅仅是添加相同的值。

如果我按两次按钮会打印:

[S14, S18, S19, S12, S02, V08, S01, O09, S14, S18, S19, S12, S02, V08, S01, O09]

感谢您的帮助!)

void fetchDataStandart() async {
  final urlAuth =
      Uri.parse('http://XXX.XX.XXX.XXX/api/usersessions/activeinfo');
  final response = await http
      .get(urlAuth, headers: <String, String>{'authorization': basicAuth});

  if (response.statusCode == 200) {
    List listPc = List.from(json.decode(response.body)['result']);

    for (int i = 0; i < listPc.length; i++) {
      pcBusy.add(listPc[i]['hostName']);
    }
    print(pcBusy);
  } else {
    throw Exception('Ошибка получения данных');
  }
}

【问题讨论】:

    标签: arrays json list flutter dart


    【解决方案1】:

    TLDR:将Future&lt;void&gt; 添加为您的函数返回类型,并考虑在用新数据覆盖之前调用pcBusy.clear()(不过取决于您的逻辑)。

    有了更多的上下文,你会帮助我给你一个更完整的答案,但这是我从你的代码中看到的:

    1. 您的按钮添加数据的次数与您按下它的次数一样多。如果你按下它两次,你迟早会得到“双倍”的数据。发生这种情况是因为您使用了add 方法,它只是您列表中的appends 数据。您可以在添加值之前使用pcBusy.clear() 重置值,或者如果您认为此函数不应该覆盖您的列表,请执行其他操作。这真的取决于你的逻辑;
    2. 你是awaiting 一个Future(通过async 关键字),但是你的函数没有返回一个Future。这意味着 - 很可能 - 您正在其他地方等待这个实际上不需要等待的功能。因此,这意味着当您第一次按下按钮时,即您触发未来,您不能等待它发生并且您的 UI 不会更新。第二次,它会使用之前的结果更新您的 UI,并再次触发 Future,让它再次使用两次值更新您的列表,如步骤 (1) 中所述。

    希望这会有所帮助。 编辑。这是一些编辑过的代码:

    // we want this function to be awaited: let it be a Future<void> async function
    Future<void> fetchDataStandart() async {
      // ... firing an async HTTP request
    
      if (response.statusCode == 200) {
        // if everything is OK, decode the JSON
        List listPc = List.from(json.decode(response.body)['result']);
    
        // the following will OVERWRITE the list.
        pcBusy.clear(); // Or maybe save previous data somewhere else?
        for (int i = 0; i < listPc.length; i++) {
          pcBusy.add(listPc[i]['hostName']);
        }
        print(pcBusy);
      } else {
        throw Exception('Ошибка получения данных');
      }
    }
    

    【讨论】:

      【解决方案2】:

      要删除重复项,您可以将列表转换为集合,然后再次转换回列表。

      pcBusy.toSet().toList();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-10-28
        • 2022-01-23
        • 2011-04-18
        相关资源
        最近更新 更多