Flutter: как выбрать значок изображения в списке, не выбрав все значки в списке?

Я создал список во Flutter, используя Sliver (структура Sliver ниже):

return Scaffold(

  body: CustomScrollView(
    slivers: <Widget>[
      SliverAppBar(
        //leading: Icon(Icons.arrow_back),
        expandedHeight: 150.0,
        pinned: true,
      ),

      SliverList(
        delegate: SliverChildBuilderDelegate(
          (BuildContext context, int index) {
            final item = taskList[index];

            return Card()

Карточка имеет скрытый виджет, внутри которого создается ListTile. Dismissible работает нормально, и я могу смахнуть, чтобы закрыть отдельные ячейки в списке.

Проблема, с которой я столкнулся, связана с IconButton в моем ListTile. Моя цель состоит в том, чтобы всякий раз, когда я нажимаю кнопку IconButton, он должен включать или выключать флаг значка для отдельной ячейки, но происходит то, что все кнопки со значками в списке переключаются. Изучив код отклоняемого виджета, я понял, что мне нужно однозначно идентифицировать каждую ячейку, чтобы это работало. Я пробовал использовать ключ, чтобы сделать ячейки уникальными, но это не сработало. Может ли кто-нибудь направить меня в правильном направлении? Код для IconButton приведен ниже. Я также попытался добавить ключ в ListTile, но это не сработало, поэтому я удалил его.

IconButton( 
  key: Key(item),
  icon: Icon(Icons.flag),
  color: (isPriority) ? Colors.red : Colors.grey,
  onPressed: _toggleFlag,
) 

person Abu    schedule 09.10.2018    source источник
comment
обновить свой код _toggleFlag?   -  person Archu Mohan    schedule 09.10.2018
comment
Нужно ли мне передавать ключ в код флажка переключения, чтобы передать ключ? void _toggleFlag () {setState (() {if (isPriority) {isPriority = false;} else {isPriority = true;}}); }   -  person Abu    schedule 09.10.2018
comment
вы используете imagebutton в своем списке?   -  person Archu Mohan    schedule 09.10.2018
comment
используйте _togglrFlag внутри набора State   -  person Archu Mohan    schedule 09.10.2018
comment
правильно, кнопка Image находится внутри Sliver List, инкапсуляция выглядит следующим образом: SliverList - ›SliverChildBuilderDelegate -› Card - ›Dismissible -› ListTile - ›IconButton   -  person Abu    schedule 09.10.2018
comment
ниже код работает?   -  person Archu Mohan    schedule 09.10.2018


Ответы (3)


Мой код toggleFlag ниже, у меня уже есть setState, он переключает флаг, но проблема в том, что он переключает все флаги в списке, когда я хочу переключить флаг ячейки, которой он принадлежит:

void _toggleFlag() {
  setState(() {
    if (isPriority) {
      isPriority = false;
    } else {
      isPriority = true;
    }
  });
}
person Abu    schedule 09.10.2018

Создайте свою карту вот так

 return new Users(example: taskList[index]);

затем краете виджет для карты

class Users extends StatefulWidget
{

final String example;
const  Users  ({Key key, this.example}) : super(key: key);
@override
UserWidgets createState() => UserWidgets();
}

class UserWidgets extends State<Users>
{

 @override
 Widget build(BuildContext context)
 {
     return new Container(

  child: Card(
     child:new IconButton( 
 icon: Icon(Icons.flag),
 color: (isPriority) ? Colors.red : Colors.grey,
 onPressed: ()
   {
    setState(() {
  if (isPriority) {
  isPriority = false;
  } else {
  isPriority = true;
  }
  });
   }
    ,
   ), 
  );
  }
person Archu Mohan    schedule 09.10.2018
comment
нет, это не сработало, оно все равно переключает все флаги в списке. Я хочу, чтобы он переключал только флаг ячейки, которой он принадлежит. - person Abu; 09.10.2018
comment
это файл списка задач, изображение или строка? - person Archu Mohan; 09.10.2018
comment
список задач - это список строк, он может однозначно добавлять списки в ячейки, эта часть работает нормально. Итак, у меня есть ячейка для каждого элемента в списке - person Abu; 09.10.2018
comment
если вы хотите получить доступ к чему-либо, вы можете использовать widget.example следующим образом - person Archu Mohan; 09.10.2018
comment
спасибо за ваш ответ, как это сделает ячейки списка уникальными для нажатия значка по сравнению с тем, как я сделал это с помощью ключа. Я пытаюсь понять, почему я ошибся в своем подходе - person Abu; 09.10.2018

Мне удалось упростить свой код, чтобы захватить все это и показать, где подходит кнопка со значком (кнопка со значком находится справа внизу). У меня по-прежнему возникает проблема, заключающаяся в том, что если я нажму на флаг значка, тогда будут включены все флажки значков, а не конкретный, который я нажал.

class HomePage extends StatefulWidget {
  _HomePageDemoState createState() => _HomePageDemoState();
}

class _HomePageDemoState extends State<HomePage> {
  List<String> taskList = [
    'The Enchanted Nightingale',
    'The Wizard of Oz',
    'The BFG'
  ];
  bool isPriority = false;

  void _toggleFlag() {
    setState(() {
      if (isPriority) {
        isPriority = false;
      } else {
        isPriority = true;
      }
    });
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body: CustomScrollView(
        slivers: <Widget>[
          SliverList(
            delegate: SliverChildBuilderDelegate(
              (BuildContext context, int index) {
                final item = taskList[index];
                return Card(
                  elevation: 8.0,
                  child: ListTile(
                    contentPadding: EdgeInsets.all(0.0),
                    leading: Container(
                      color: (isPriority) ? Colors.red : Colors.grey,
                      //padding: EdgeInsets.only(right: 12.0),
                      padding: EdgeInsets.all(20.0),
                      child: Text(
                        '01',
                        style: TextStyle(
                            fontSize: 20.0,
                            fontWeight: FontWeight.bold,
                            color: Colors.white),
                      ),
                    ),
                    title: Text('$item'), //Text('The Enchanted Nightingale'),
                    subtitle:
                        Text('Music by Julie Gable. Lyrics by Sidney Stein.'),


                    trailing: IconButton(
                      key: Key(item),
                      icon: Icon(Icons.flag),
                      color: (isPriority) ? Colors.red : Colors.grey,
                      onPressed: _toggleFlag,
                    ),
                  ),
                );
              },
              childCount: taskList.length,
            ),
          ),
        ],
      ),
    );
  }
}
person Abu    schedule 09.10.2018