StreamBuilder中的按钮重建小部件

时间:2019-08-08 14:34:29

标签: flutter dart

我正在使用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()。

0 个答案:

没有答案