Изменение только одной плитки списка в представлении списка, чтобы она была уникальной в Flutter

#flutter #dart

#flutter #dart

Вопрос:

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

Вот код для этого, я не уверен, возможно ли это, поскольку конструктор состоит из блока и существующего класса Person, в основном шаблона для каждого элемента списка. Я пытался добавить uniqueKey(), но, похоже, это ничего не дает. Вот код для представления списка:

_chosenSize

 String _chosenSize;

child: BlocConsumer<PersonBloc, List<Person>>(
    builder: (context, personList) {
      return ListView.separated(
        itemBuilder: (BuildContext context, int index) {
          print("personList: $personList");

          Person person = personList[index];
          return ListTile(
          key: UniqueKey() //added unique key here, but it still fails
          //for example, is it possible to make this list tile unique
          //if I make change to it, it only changes the one I change, and not
          //all of them in a list at once
          leading: _buildSize(); //DROPDOWN HERE
          
              trailing: Icon(Icons.person),
              title: Text("${person.name} ${person.age}",
                  style: TextStyle(fontSize: 30)),
              subtitle: Text(
                "person.name",
                style: TextStyle(fontSize: 25),
              ),
              onTap: () => showDialog(context, person, index));
        },
        itemCount: personList.length,
        separatorBuilder: (BuildContext context, int index) =>
            Divider(color: Colors.black),
      );
    },
    listener: (BuildContext context, personList) {},
  ),
 

Затем вот код для выпадающего списка:

 Widget _buildSize() {
return DropdownButton<String>(
  focusColor: Colors.white,
  value: _chosenSize,
  //elevation: 5,
  style: TextStyle(color: Colors.white),
  iconEnabledColor: Colors.black,
  items: <String>[
    '',
    'S',
    'M',
    'L',
    'XL',
  ].map<DropdownMenuItem<String>>((String value) {
    return DropdownMenuItem<String>(
      value: value,
      child: Text(
        value,
        style: TextStyle(color: Colors.black),
      ),
    );
  }).toList(),
  hint: Text(
    "Size",
    style: TextStyle(
        color: Colors.black, fontSize: 14, fontWeight: FontWeight.w500),
  ),
  onChanged: (String value) {
    setState(() {
      _chosenSize = value;
    });
  },
)};
 

Что происходит, так это то, что когда я меняю параметр «размер» из выпадающего списка, он изменяется для всех плиток списка, мне нужно, чтобы он менялся только для одного, а затем сохранял его состояние. Вот что происходит:

введите описание изображения здесь

Комментарии:

1. Где вы определили _chosenSize переменную?

2. Я объявил его поверх самого класса как пустую строку: String _chosenSize; Добавил его в основной почтовый индекс.

Ответ №1:

Вам также нужно создать список для _chosenSize, который вы передаете Widget _buildSize(String _chosenSize) с _buildSize(_chosenSize[index]) помощью, а также сохранить его там с помощью OnChanged

 class MyPageState extends State<MyPage> { 
List<String> _chosenSizes = [];

...

return ListView.separated(
        itemBuilder: (BuildContext context, int index) {
          print("personList: $personList");

          Person person = personList[index];
          return ListTile(
          key: UniqueKey() //added unique key here, but it still fails
          //for example, is it possible to make this list tile unique
          //if I make change to it, it only changes the one I change, and not
          //all of them in a list at once
          leading: _buildSize(index]); //DROPDOWN HERE
          
              trailing: Icon(Icons.person),
              title: Text("${person.name} ${person.age}",
                  style: TextStyle(fontSize: 30)),
              subtitle: Text(
                "person.name",
                style: TextStyle(fontSize: 25),
              ),
              onTap: () => showDialog(context, person, index));
        },
        itemCount: personList.length,
        separatorBuilder: (BuildContext context, int index) =>
            Divider(color: Colors.black),
      );
      
      ...
      
      Widget _buildSize(int index) {
return DropdownButton<String>(
  focusColor: Colors.white,
  value: _chosenSizes[index],

...

  onChanged: (String value) {
    setState(() {
      _chosenSizes[index] = value;
    });
  },
)};

}
 

Комментарии:

1. О, вы, вероятно, правы. _chosenSize объявляется только как пустая строка поверх класса.

2. Я действительно ценю ответ, не могли бы вы, пожалуйста, просто добавить его в код, поскольку я не уверен, куда именно его вставить? Я добавил, как я объявил _chosenSize в основном сообщении.

3. См. Редактирование — на самом деле разумнее передавать индекс только _buildSize()

4. Если это помогло вам, принятие ответа было бы хорошим жестом

5. Конечно, это полностью сработало, я некоторое время думал о том, как это закончить. Спасибо, это очень ценится!