首页 > 解决方案 > 使用 Flutter/Dart 我应该如何查询不构建小部件的数据?

问题描述

我正在开发一个应用程序,我对这个场景还比较陌生,但是当我想简单地查询一些数据时遇到了一些麻烦。

我在有人登录后调用一个函数。登录函数只发送必要的信息,我想对我的服务器进行二次 ping 以获得更多用户信息,而不仅仅是验证登录信息。

getUser (userid) async{

    List<Map<String, dynamic>> user=[] ;

    var client = new http.Client();
    try {
      var req = await client.post(urlPath+'mobileGetUser', body: {'thisUserID': userid'});

      var jsonResponse = convert.jsonDecode(req.body);
      //print('Here: '+jsonResponse.toString());

      var id = jsonResponse['id'] ?? '';
      var joinDate = jsonResponse['joinDate'] ?? '';
      var userEmail = jsonResponse['userEmail'] ?? '';
      var displayName = jsonResponse['displayName'] ?? '';
      var timezone = jsonResponse['timezone'] ?? '';
      var verified = jsonResponse['verified'] ?? '';

      user = [{'id': id}];
      user = [{'joinDate': joinDate}];
      user = [{'userEmail': userEmail}];
      user = [{'displayName': displayName}];
      user = [{'timezone': timezone}];
      user = [{'verified': verified}];

      return user

    } finally {
      client.close();
    }
  }

我习惯于在 PHP 中工作。在那种语言中,我会将 JSON 对象或关联数组传递回调用函数,访问各个字段就像

$displayName = $user['displayName'];

但这不是 PHP。列表类型对我来说还是有点奇怪。

从我的调用函数中,我尝试使用以下方法进行测试:

thisUser = getUser(userid);
print('Successful Login: Display name: '+thisUser.toString());

我收到一条消息:

Successful Login: Display name: Instance of 'Future<dynamic>'

我怎样才能访问这些数据?我已经尝试了几种方法来获得它。另外,有没有更好的方法来创建我的列表?我肯定会经历一些不必要的步骤。老实说,我很喜欢将整个 JSONresponse 传递给它。我只是有点超出我的深度。

标签: flutterdart

解决方案


你可以这样做:

thisUser = await getUser(userid);
print('after'); // this will print after getUser() finishes

如果您不await完成getUser(),那么您将收到一个Future.


另一种方法是使用它Future并为其添加一个侦听器,如下所示:

getUser(userid).then((value) {
  print('after'); // this will print after getUser() finishes
  thisUser = value;
});
print('before'); // this will print before getUser() finishes

这是假设您没有在小部件上使用它。否则,您可以FutureBuilder用来检测何时Future完成并显示某些内容。


推荐阅读