类型“Future< String>”不是flutter中类型转换的类型“String”的子类型

wgx48brx  于 2022-12-19  发布在  Flutter
关注(0)|答案(3)|浏览(253)

我使用以下函数从Web服务获取用户ID

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/扑动(18036):'Future'的示例

0qx6xfy6

0qx6xfy61#

您需要等待您的函数。如果您完全不知道 Dart 中的Future,您应该通读this comprehensive article
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)
                       });
}
tpgth1q7

tpgth1q72#

欧盟解决方案是“转换”的后续maneira:

Future<String> getData() async{
  return Future.value("Data to be converted");
}

void main() async {
  Future<String> stringFuture = getData();
  String message = await stringFuture;
  print(message); // irá ser impresso 'data to be converted' no console.
}
pkbketx9

pkbketx93#

不能使用直接将Future<String>返回值赋值给String变量。
使用then并获取字符串值。
试着这样做:

otherFunction() async {
final String userID;
await getUserid().then((value) {
      if (value != null && value != "") {
       userID = value;
      }
    });
 return userID;
}

Future<String> getUserid() async {
  final storage = new FlutterSecureStorage();
  // Read value
  String userID = await storage.read(key: 'userid');
  return userID;
}

print(otherFunction());

相关问题