我正在使用StreamBuilder从API中获取数据,但是当我按下按钮时,列表再次进入等待状态,并且UI并未按需更改,仅更改了一次。
StreamBuilder<List<Contact>>(
stream: Provider.of<MainModel>(context, listen: false)
.fetchContacts()
.asStream(),
builder: (BuildContext context, snapshot) {
}
return Expanded(
child: ListView.builder(
itemCount: snapshot.data[i].keys.length,
itemBuilder: (context, index) {
return StickyHeader(
header: Container(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text(
'${snapshot.data[i].keys.keys.toList()[index]}',
),
],
),
),
content: ListView.builder(
itemCount:
snapshot.data[i].values.toList()[index].length,
shrinkWrap: true,
physics: NeverScrollableScrollPhysics(),
itemBuilder: (context, nestedIndex) {
return Column(
children: <Widget>[
ListTile(
title: Row(
crossAxisAlignment:
CrossAxisAlignment.center,
mainAxisSize: MainAxisSize.max,
children: <Widget>[
Container(
child: SelectContactButton(
index: index,
nestedIndex: nestedIndex,
sortedContacts: sortedContacts,
)),
Text(
'${snapshot['${snapshot.data.keys.toList()[index]}'][nestedIndex].name}',
style: TextStyle(fontSize: 20.0),
)
],
))
],
);
}));
}));
});
}
按钮的代码在这里,我也更改了一些快照的字段名称,因为它们在我的代码中变得太长,而且toggleSelectedContacts还在ContactModel内更改了一个字段,该字段指示是否选择了Contact ,默认情况下为false,因此在按下时必须将其更改为true。
class _SelectContactButtonState extends State<SelectContactButton> {
@override
Widget build(BuildContext context) {
print(widget.sortedContacts);
return FloatingActionButton(
heroTag: null,
onPressed: () {
Provider.of<MainModel>(context, listen:false).selectContact(widget
.snapshot.data[
'${widget.snapshot.data.keys.toList()[widget.index]}']
[widget.nestedIndex]
.id);
Provider.of<MainModel>(context, listen: false).toggleSelectedContact();
},
);
}
}
我认为由于模型更改,使用listen:false可能会禁用列表的重新整理,但这没有帮助。 我也将代码包装在setState中的onPressed内,但这也不起作用。 因此,我该如何使用带有按钮的StreamBuilder来更改其外部小部件的一部分,如果有任何选定的联系人,它将显示其ID或类似的内容,否则将显示Container()。