#dart #flutter
#дротик #flutter
Вопрос:
Я использовал следующую функцию для получения идентификатора пользователя из веб-службы
Future<String> getUserid() async {
final storage = new FlutterSecureStorage();
// Read value
String userID = await storage.read(key: 'userid');
return userID;
}
при использовании этой функции возникла ошибка
тип ‘Future’ не является подтипом типа ‘String’ в приведении типов
это то, что я пробовал
otherFunction() async {
final String userID = await getUserid();
return userID;
}
Future<String> getUserid() async {
final storage = new FlutterSecureStorage();
// Read value
String userID = await storage.read(key: 'userid');
return userID;
}
print(otherFunction());
сообщение об ошибке по-прежнему отображается как
I / flutter (18036): экземпляр ‘Future’
Комментарии:
1. Функции, отмеченные
async
знаком, всегда возвращаютFuture
s. Вы также должны использоватьawait otherFunction()
. Также, пожалуйста, обратите внимание на то, в какой строке отображается сообщение об ошибке.
Ответ №1:
Вам нужно будет дождаться своей функции. Если вы совершенно не знаете о Future
‘s в Dart, вам следует прочитать эту всеобъемлющую статью.
В Flutter теперь есть два способа обработки этого случая. Либо вы хотите вызвать свою функцию в обычной другой функции. В этом случае вы должны либо пометить эту функцию как async
или использовать getUserid().then((String userID) {...})
. Если бы вы хотели использовать async
, вам await
также нужно было бы использовать:
otherFunction() async {
...
final String userID = await getUserid();
...
}
Однако в Flutter очень вероятно, что вы захотите использовать свое значение в build
методе вашего виджета. В этом случае вам следует использовать FutureBuilder
:
@override
Widget build(BuildContext context) {
return FutureBuilder(future: getUserid(),
builder: (BuildContext context, AsyncSnapshot<String> snapshot) {
if (!snapshot.hasData) return Container(); // still loading
// alternatively use snapshot.connectionState != ConnectionState.done
final String userID = snapshot.data;
...
// return a widget here (you have to return a widget to the builder)
});
}
Комментарии:
1. Я просто хочу вернуть значение без создания виджета. как я могу это сделать?
2. @sampathwijesinghe Я показал это в своем ответе. Я также связал статью, которая объясняет это более глубоко.
3. Я обновил свой вопрос, применив ваш код. и все еще показывает ошибку.
4. @sampathwijesinghe Ты прочитал всю статью? Это происходит потому , что вы все еще возвращаете a
Future
. Вам нужно было бы использоватьprint(await getUserid())
.5. OtherFunction() async { print(await getUserid()); } Я использовал это, и это работает, но вывод показывает как ошибку, так и возврат I / flutter (31141): экземпляр «будущего» I / flutter (31141): 27808