簡體   English   中英

如何在 listview.builder 中管理 listtiles 的選定變量

[英]How to manage selected variables for listtiles inside of a listview.builder

我有一個返回ListTileListView.builder itemCount設置為min(_selectedEvents.length, 3) 因此,最多返回 3 個ListTile ,其backgroundColorColors.grey[200]

我想在按下單個ListTile時將顏色設置為Colors.red 我設置 selected: _selectedListtileController (我創建的一個var )並使用onTap將其設置為 true,這會將顏色更改為紅色。

但問題是紅色是為所有ListTile設置的,而不是為單個設置的。 也不能創建 3 個單獨的控制器,因為我在ListTile中返回它們,我只能傳遞 1 個 controller。

每當按下ListTile時,如何設置單獨ListTile的顏色?

提前致謝!

如果您希望有多個ListTile可供選擇,我們可以定義一個List<int>來保存所選ListTileindexes

// 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM