在Flutter类型转换中,类型'Future <string>'不是类型'String'的子类型

时间:2019-04-18 09:42:05

标签: dart flutter

我使用以下功能从Web服务获取用户ID

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

使用此功能时发生错误

  

类型'Future'不是类型转换类型'字符串'的子类型

这就是我尝试过的

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):“未来”的实例

1 个答案:

答案 0 :(得分:2)

您将需要等待。如果您完全不了解 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)
                       });
}