тип ‘Future’ не является подтипом типа ‘String’ в приведении типа в flutter

#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