![](/img/trans.png)
[英]Check / Uncheck ListTiles in ListView.builder() - Flutter
[英]How to manage selected variables for listtiles inside of a listview.builder
我有一個返回ListTile
的ListView.builder
。 itemCount
設置為min(_selectedEvents.length, 3)
。 因此,最多返回 3 個ListTile
,其backgroundColor
為Colors.grey[200]
。
我想在按下單個ListTile
時將顏色設置為Colors.red
。 我設置 selected: _selectedListtileController
(我創建的一個var
)並使用onTap
將其設置為 true,這會將顏色更改為紅色。
但問題是紅色是為所有ListTile
設置的,而不是為單個設置的。 也不能創建 3 個單獨的控制器,因為我在ListTile
中返回它們,我只能傳遞 1 個 controller。
每當按下ListTile
時,如何設置單獨ListTile
的顏色?
提前致謝!
如果您希望有多個ListTile
可供選擇,我們可以定義一個List<int>
來保存所選ListTile
的indexes
:
// StatefulWidget is required
List<int> _selectedTiles = [];
並使用以下函數來切換特定ListTile
:
void toggleSelectedListTile(int index) {
if (_selectedTiles.contains(index))
setState(() => _selectedTiles.remove(index));
else
setState(() => _selectedTiles.add(index));
}
ListTile
Widget
具有selected
屬性,我們可以利用它:
ListTile(
selected: _selectedTiles.contains(index),
selectedTileColor: Colors.red,
title: Text('List tile $index'),
onTap() { toggleSelectedListTile(index); },
)
因此,此解決方案的完整示例片段將是:
class HomeWidget extends StatefulWidget {
HomeWidget({ Key key }) : super(key: key);
@override
_HomeWidgetState createState() => _StatefulWidgetExampleState();
}
class _HomeWidgetState extends State<StatefulWidgetExample> {
List<int> _selectedTiles = [];
void toggleSelectedListTile(int index) {
if (_selectedTiles.contains(index))
setState(() => _selectedTiles.remove(index));
else
setState(() => _selectedTiles.add(index));
}
Widget _buildListTile(int index) {
return ListTile(
selected: _selectedTiles.contains(index),
selectedTileColor: Colors.red,
title: Text('List tile $index'),
onTap() { toggleSelectedListTile(index); },
);
}
@override
Widget build(BuildContext context)
return Scaffold(
body: new ListView.builder
(
itemCount: 3,
itemBuilder: (BuildContext ctxt, int index) => _buildListTile(index),
),
);
}
在 class 的頂部創建一個空的 map
final _isSelected = Map();
@override
Widget build(BuildContext context) {
在您的 ListView.builder 上
ListView.builder(
itemCount: _selectedEvents.length,
itemBuilder: (context, index) {
//add this line to initiate
if (!_isSelected.containsKey(index)) // important
_isSelected[index] = false;
return ListTile(
...
...
// and this line to check listTile is selected or not
selected: _isSelected[index],
tileColor: Colors.grey[200],
selectedTileColor: Colors.red,
onTap: () {
setState(() => _isSelected[index] = !_isSelected[index] );
},
);
},
),
或者您可以在 initState() 創建您選擇的邏輯
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.