#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. Конечно, это полностью сработало, я некоторое время думал о том, как это закончить. Спасибо, это очень ценится!