Flutter 颤振:在FutureBuilder小部件中从Future检索关联对象
我正在从对象“event”的未来获取用户“event manager id”数据。我现在想获取一个用户,使用该id在事件旁边显示他的名字。但是,我的FutureBuilder小部件只考虑一个未来事件,我无法基于该事件检索该用户名,因为我的fetchUser方法将只返回未来的对象 非常感谢您的帮助 以下是FutureBuilder小部件:Flutter 颤振:在FutureBuilder小部件中从Future检索关联对象,flutter,dart,future,Flutter,Dart,Future,我正在从对象“event”的未来获取用户“event manager id”数据。我现在想获取一个用户,使用该id在事件旁边显示他的名字。但是,我的FutureBuilder小部件只考虑一个未来事件,我无法基于该事件检索该用户名,因为我的fetchUser方法将只返回未来的对象 非常感谢您的帮助 以下是FutureBuilder小部件: body: new FutureBuilder( future: events, builder: (Build
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方法中获取数据,从而以某种方式将变量存储为列表。如果这些方法都不起作用,请回复。希望有帮助: