在 ListView 中使用 setState
Use setState in ListView
我试图从两个 table 中获取数据并显示到 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)
从另一个 table 获取名称。但是,名称总是显示为空。
每当您使用 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),
],
),
))
},
);
});
希望对您有所帮助,如有疑问请评论。
如果它对您有用,请不要忘记接受并给答案投赞成票。
我试图从两个 table 中获取数据并显示到 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)
从另一个 table 获取名称。但是,名称总是显示为空。
每当您使用 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),
],
),
))
},
);
});
希望对您有所帮助,如有疑问请评论。 如果它对您有用,请不要忘记接受并给答案投赞成票。