Flutter 在 ListView 中只重建一行
Flutter Rebuild Just One Row in 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;
});
}))
])
))
}
你必须使用范围模型、BLoC、redux 等状态管理方法。 Checkout this post to get a proper idea
我遇到了同样的问题。我按照以下步骤计算出来:
- 创建流控制器
- 判断并将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();
}
我的应用程序中有一个列表视图。每行都有一些仅影响同一行的按钮。我不想刷新整个 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;
});
}))
])
))
}
你必须使用范围模型、BLoC、redux 等状态管理方法。 Checkout this post to get a proper idea
我遇到了同样的问题。我按照以下步骤计算出来:
- 创建流控制器
- 判断并将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();
}