Обновите один список из значений другого списка

#arrays #json #list #flutter #dart

Вопрос:

Я написал код, который получает данные Json и помещает в listPc. И написал цикл, который добавляет значение ‘Имя хоста’ из формы listPc в список pcBusy. Но мой код добавляет значения только во второй список, если я нажму кнопку Get значения в дубликатах списка pcBusy. Мне нужно обновить список 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('Ошибка получения данных');
  }
}
 

Ответ №1:

TLDR: добавьте Future<void> в качестве типа возвращаемой функции и рассмотрите возможность вызова pcBusy.clear() перед перезаписью новыми данными (хотя это зависит от вашей логики).

С немного большим контекстом вы помогли бы мне дать вам более полный ответ, но вот что я вижу из вашего кода:

  1. Ваша кнопка добавляет данные столько раз, сколько вы ее нажимаете. ЕСЛИ вы нажмете его два раза, рано или поздно вы получите «двойные» данные. Это происходит потому, что вы используете add метод, который просто appends содержит данные в вашем списке. Вы можете либо сбросить значения pcBusy.clear() перед добавлением значений, либо сделать что-то еще, если считаете, что эта функция не должна перезаписывать ваш список. Это действительно зависит от вашей логики;
  2. Вы awaiting -Будущее (по async ключевому слову), но ваша функция не возвращает Будущее. Это означает, что — скорее всего — где-то еще вы ждете этой функции, которую на самом деле не нужно ждать. Как следствие, это означает, что когда вы впервые нажимаете кнопку, т. Е. запускаете будущее, вы не можете ждать, пока это произойдет, и ваш пользовательский интерфейс не обновляется. Во второй раз он обновляет ваш пользовательский интерфейс с предыдущим результатом, и будущее запускается снова, позволяя ему снова обновить ваш список с удвоенными значениями, как описано в шаге (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();