#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()
и returnendpoint.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;
}