我试图从两个表中获取数据并显示到ListView。
child: Container(
child: StreamBuilder<List<ABC>>(
stream: _abcBloc
.getListStream,
builder: (context, snapshot) {
switch (snapshot.connectionState) {
case ConnectionState.waiting:
return Center(
child: Image.asset(
'assets/loading.gif',
width: 200.0,
height: 200.0,
),
);
break;
case ConnectionState.active:
if (snapshot.data.isEmpty) {
return Container(child: Text('empty'));
} else {
return ListView.builder(
shrinkWrap: true,
itemCount: snapshot.data.length,
itemBuilder: (context, index) {
var _reading = snapshot.data[index];
var name;
_abcBloc.getName(_reading.Id)
.then((onValue) {
name = onValue.name;
});
return InkWell(
onTap: () {},
child: Padding(
padding: EdgeInsets.all(10),
child: Column(
children: <Widget>[
Text(name == null ? '' : name),
],
),
));
});
}
break;
default:
return Text("edwqd");
}
}))
首先它将调用_abcBloc.getListStream
。我能够在这一行中获取数据
(var _reading = snapshot.data[index];
。
此后,我想通过调用此函数_abcBloc.getName(_reading.Id)
从另一个表中获取名称。但是,该名称始终显示为空。
答案 0 :(得分:1)
每当您使用Future并根据未来的价值创建窗口小部件时,都应始终使用FutureBuilder。
用以下代码替换ListView.builder:
ListView.builder(
shrinkWrap: true,
itemCount: snapshot.data.length,
itemBuilder: (context, index) {
var _reading = snapshot.data[index];
var name;
// _abcBloc.getName(_reading.Id)
// .then((onValue) {
// name = onValue.name;
// });
return FutureBuilder(
future: _abcBloc.getName(_reading.Id),
builder: (BuildContext context, AsyncSnapshot snapshot) {
if(!snapshot.hasData) return Container();
name = snapshot.data;
return InkWell(
onTap: () {},
child: Padding(
padding: EdgeInsets.all(10),
child: Column(
children: <Widget>[
Text(name == null ? '' : name),
],
),
))
},
);
});
希望这会有所帮助,如有任何疑问,请发表评论。 如果对您有用,请别忘了接受并赞成答案。