Возврат будущего в будущем

#android #flutter #dart

#Android #трепетание #dart

Вопрос:

У меня есть эти два общих предпочтения

 <string name="flutter.39281a04d2b8c8ba">{"name":"student","id":"UmWq","token":"LVF-M","isIncoming":true,"uuid":"39281a04d2b8c8ba"}</string>

<string name="flutter.4c434612edcff4bc">{"name":"student","id":"ozjU","token":"GXUTR","isIncoming":true,"uuid":"4c434612edcff4bc"}</string>
 

У меня есть идентификатор, и из него id я хочу восстановить uuid , чтобы создать файл:

 MySharedPreferences.getUuid(id).then((uuid) {
   print("ended up with this uuid: $uuid");
   FileManager.createFile(uuid, form.title).then((file) => {
       file.writeAsString(str)
   });
});
 

Это getUuid метод:

 static Future<String> getUuid(String id) async {
    final prefs = await SharedPreferences.getInstance();
    for (String key in prefs.getKeys()){
      print("looking at $key");
      if (!key.contains("#")){
        return getData(key).then((value){
          print("got this value: $value");
          Map<String, dynamic> endpointJson = jsonDecode(value);
          EndpointData endpoint = EndpointData.fromJson(endpointJson);
          print("endpoint.id: ${endpoint.id}");
          print("id: $id");
          if (endpoint.id == id){
            print("the good return");
            return endpoint.uuid;
          }
          return null;
        });
      }else{
        continue;
      }
    }
  }
 

Как вы можете видеть, getUuid , извлекает список всех ключей внутри общих настроек и выполняет итерации по ним. Для каждого ключа я считываю связанные данные и проверяю id , соответствуют ли они моим, поэтому возвращаюсь uuid .

Теперь я знаю проблему, но я не могу найти способ ее исправить. Проблема заключается в следующем. Предполагая id ozjU , что моя getUuid функция перебирает ключи по порядку, поэтому, если сначала проверить 39281a04d2b8c8ba . 39281a04d2b8c8ba Идентификатор не равен моему, поэтому inside getData возвращает null, что также приводит getUuid к возврату null . Я не знаю, как заставить getData возвращать значение, если endpoint.id == id или не возвращать что-либо, и пусть outer for продолжает перебирать оставшиеся ключи.

РЕДАКТИРОВАТЬ: в соответствии с запросом, проверено следующим образом, и по-прежнему uuid равен нулю:

 static Future<String> getUuid(String id) async {
    final prefs = await SharedPreferences.getInstance();
    for (String key in prefs.getKeys()){
      print("looking at $key");
      if (!key.contains("#")){
        return getData(key).then((value){
          print("got this value: $value");
          Map<String, dynamic> endpointJson = jsonDecode(value);
          EndpointData endpoint = EndpointData.fromJson(endpointJson);
          print("endpoint.id: ${endpoint.id}");
          print("id: $id");
          if (endpoint.id == id){
            print("the good return");
            return endpoint.uuid;
          }
        });
      }else{
        continue;
      }
    }
    return null;
  }
 

ОКОНЧАТЕЛЬНОЕ РЕДАКТИРОВАНИЕ: ожидание getData результатов сделало трюк таким:

 static Future<String> getUuid(String id) async {
    final prefs = await SharedPreferences.getInstance();
    for (String key in prefs.getKeys()){
      print("looking at $key");
      if (!key.contains("#")){
        var value = await getData(key);
        print("got this value: $value");
        Map<String, dynamic> endpointJson = jsonDecode(value);
        EndpointData endpoint = EndpointData.fromJson(endpointJson);
        print("endpoint.id: ${endpoint.id}");
        print("id: $id");
        if (endpoint.id == id){
          print("the good return");
          return endpoint.uuid;
        }
      }else{
        continue;
      }
    }
    return null;
  }
 

Комментарии:

1. jhust попробуйте удалить return null; i, завершите цикл if и поместите его после цикла for

2. Я пытался, но затем я получаю The function has a return type of 'FutureOr<String>', but doesn't end with a return statement. предупреждение в getData функции. Просто предупреждение, но я протестировал его, и uuid все равно вернулся null . Однако повторю попытку.

3. Протестировал его и по-прежнему нулевой. Используемый код был отредактирован в сообщении.

4. если это так, getData(ключ).then((значение) не ждите, пока он вернет значение для завершения итерации (он проверяет следующее значение до появления первого)я предпочитаю, чтобы вы использовали await getData (ключ), поэтому ваш код будет обязан ждать, пока не будет предоставленозначения для завершения выполнения

5. вы пытались использовать var value = await getData(key); do everything без then() и return endpoint.uuid ?

Ответ №1:

Правильный код:

 static Future<String> getUuid(String id) async {
    final prefs = await SharedPreferences.getInstance();
    for (String key in prefs.getKeys()){
      print("looking at $key");
      if (!key.contains("#")){
        var value = await getData(key);
        print("got this value: $value");
        Map<String, dynamic> endpointJson = jsonDecode(value);
        EndpointData endpoint = EndpointData.fromJson(endpointJson);
        print("endpoint.id: ${endpoint.id}");
        print("id: $id");
        if (endpoint.id == id){
          print("the good return");
          return endpoint.uuid;
        }
      }else{
        continue;
      }
    }
    return null;
  }