Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/flutter/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Flutter 颤振:在FutureBuilder小部件中从Future检索关联对象_Flutter_Dart_Future - Fatal编程技术网

Flutter 颤振:在FutureBuilder小部件中从Future检索关联对象

Flutter 颤振:在FutureBuilder小部件中从Future检索关联对象,flutter,dart,future,Flutter,Dart,Future,我正在从对象“event”的未来获取用户“event manager id”数据。我现在想获取一个用户,使用该id在事件旁边显示他的名字。但是,我的FutureBuilder小部件只考虑一个未来事件,我无法基于该事件检索该用户名,因为我的fetchUser方法将只返回未来的对象 非常感谢您的帮助 以下是FutureBuilder小部件: body: new FutureBuilder( future: events, builder: (Build

我正在从对象“event”的未来获取用户“event manager id”数据。我现在想获取一个用户,使用该id在事件旁边显示他的名字。但是,我的FutureBuilder小部件只考虑一个未来事件,我无法基于该事件检索该用户名,因为我的fetchUser方法将只返回未来的对象

非常感谢您的帮助

以下是FutureBuilder小部件:

        body: new FutureBuilder(
        future: events,
        builder: (BuildContext context, AsyncSnapshot<List> snapshot) {
          List<Event> availableEvents = snapshot.data;
          if (!snapshot.hasData) return CircularProgressIndicator();
          return new ListView.builder(
            scrollDirection: Axis.vertical,
            padding: new EdgeInsets.all(6.0),
            itemCount: availableEvents.length,
            itemBuilder: (BuildContext context, int index) {
              user = fetchUserbyId( // Here, user is of type Future<user> and I cannot retrieve info such as the name of that user
                  (availableEvents[index].managerId).toString());
              return new Container(
                  margin: new EdgeInsets.only(bottom: 6.0),
                  padding: new EdgeInsets.all(6.0),
                  color: Colors.white,
                  child: Column(
                    children: <Widget>[
                      new Text('${availableEvents[index].name}',
                          style: TextStyle(
                              fontWeight: FontWeight.bold,
                              height: _height,
                              fontSize: 18)),
                      new Text('${availableEvents[index].description}',
                          style: TextStyle(height: _height)),
                      new Text('${availableEvents[index].address}',
                          style: TextStyle(height: _height)),
                      new Text('${availableEvents[index].datetime}',
                          style: TextStyle(height: _height)),
                      //new Text('${availableEvents[index].managerId}', style: TextStyle(height: _height)),

                      new FlatButton(
                        onPressed: null,
                        // Simply call joinEvent for event 'availableEvents[index]'
                        color: Colors.redAccent,
                        textColor: Colors.white,
                        disabledColor: Colors.red,
                        disabledTextColor: Colors.white,
                        padding: EdgeInsets.all(8.0),
                        splashColor: Colors.redAccent,
                        child: Text('Join!'),
                      )
                    ],
                  ));
            },
          );
        }));
以下是fetchUserByID方法:

    Future<User> fetchUserbyId(String id) async {
  final response =
      await http.get('https://url-here.com' + id);
  //print("response : " + response.body);
  if (response.statusCode == 200) {
    // If the call to the server was successful, parse the JSON.
    return User.fromJson(json.decode(response.body));
  } else {
    // If that call was not successful, throw an error.
    throw Exception('Failed to load post');
  }
}

如果我的理解是您有两个异步调用,其中第二个需要执行第一个调用的结果。解决这个问题的最佳方法是创建一个helper方法,即getData。在这个方法中,您调用事件,然后使用它来获取userbyid。这将导致您的FutureBuilder看起来像这样:

未来建设者 未来:getData 建筑商:…//获得与从给定示例中的事件中获得结果相同的结果。 ; 然后,在getData方法中,它将如下所示:

未来getData异步{ var availableEvents=await events;//不确定事件数据/方法是什么 返回fetchUserbyIdavailableEvents[index].managerId.toString; } 我想我回答了你的问题,但如果我没有回答,请评论


注意:在一个完全无关的主题上,您不再需要flifter中的new关键字来实例化对象。希望能加快你的发展进程

谢谢你的回复,但这似乎对我不起作用。我无法按您建议的方式使用帮助器方法,因为我的availableEvents已从以前的fetchEvents方法中获取,因此我使用snapshot.data定义该变量。您是否在FutureBuilder之外获取结果,以及它们是否在FutureBuilder之外使用。当您在FutureBuilder中将事件用作未来时,我不知道您的事件是什么。我的事件列表是在FutureBuilder外部获取的,并存储为列表变量FutureBevents。但它们只在FutureBuilder中使用,我在FutureBuilder中将未来设置为事件。因此,基本上您需要将未来转换为列表。我不确定这背后的代码是否有效:var availableEvents=await events@symbolads解决这个问题的方法是,在获取事件的任何地方使用wait,或者如果您仅在FutureBuilder中使用事件,则只在getData方法中获取数据,从而以某种方式将变量存储为列表。如果这些方法都不起作用,请回复。希望有帮助: