Flutter перестроить только одну строку в ListView

У меня есть один просмотр списка в моем приложении. В каждом ряду есть несколько кнопок, которые влияют только на этот ряд. Я не хочу обновлять весь Listview, Когда я звоню setState() на нажатие кнопок, что вызывает весь Listview обновить.

Как сделать обновление на одном и том же ряду кнопок внутри ряда?

В моем коде нажатие на кнопку должно вызвать изменение цвета той же кнопки:

....
....
....

List<mPlay> playList = new List();

....
....
....

@override
  Widget build(BuildContext context) {
    return new Directionality(
        textDirection: globals.textDirection,
        child: new Scaffold(
            key: globalKey,
            body: (playList != null && playList.length > 0)
                ? new SmartRefresher(
                    headerBuilder: _buildHeader,
                    enablePullDown: true,
                    enablePullUp: true,
                    onRefresh: _onRefresh,
                    onOffsetChange: _onOffsetCallback,
                    child: new ListView.builder(
                      padding: const EdgeInsets.all(0),
                      itemCount: playList.length,
                      itemBuilder: (context, i) {
                        return _buildRow(playList[i], i);
                      },
                    ))
                : EmptyWidget()));
  }

  Widget _buildRow(mPlay play, int index) {
  return new Card(
        child: new Container(
        child: new Row(children: <Widget>[
        new InkWell(
                            child: new IconButton(
                                icon: Icon(
                                  Icons.group_add,
                                  color: play.isContributed == "1"
                                      ? Colors.blueAccent
                                      : Colors.black,
                                ),                                
                                onPressed: () {
                                  play.isContributed =
                                      play.isContributed == "0" ? "1" : "0";
                                  setState(() {
                                    playList[index].isContributed =
                                        play.isContributed;
                                  });
                                }))
        ])
        ))


  }

2 ответа

Решение

Вы должны использовать методы управления состоянием, такие как объемная модель, BLoC, избыточность. Оформите этот пост, чтобы получить правильное представление

Я столкнулся с той же проблемой. Я разработал это следующим образом:

  1. создать streamController
  2. судить и назначать streamController строке, которая будет обновлена ​​позже
  3. вызовите streamController.add(...), чтобы обновить строку.

ниже приведен пример кода:

в конструкторе ListView

              return ListView.builder(
                    itemCount: 100,
                    itemBuilder: (BuildContext context, int index) {
                        return CMyListViewRow(index == _iSelectedRowIndex ? _streamCtlBet : null);
                    });

а в CMyListViewRow вы делаете следующее:

             if( _streamController != null ){
            return StreamBuilder(
                initialData: 0,
                stream: _streamController.stream,
                builder: (BuildContext context, AsyncSnapshot<int> snapshot) {
                    return _getRow();
                });
        }
        else{
            return _getRow();
        }
Другие вопросы по тегам