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, избыточность. Оформите этот пост, чтобы получить правильное представление
Я столкнулся с той же проблемой. Я разработал это следующим образом:
- создать streamController
- судить и назначать streamController строке, которая будет обновлена позже
- вызовите 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();
}