DropdownButton - Установить значение: со значением, НЕ содержащимся в списке элементов, которые пользователь может выбрать - Flutter
У меня есть DropdownButton
с двумя элементами в списке
Когда я выбираю значение 2, я хочу, чтобы отображалось значение, не содержащееся в списке
Нравится :
Это вообще возможно?
Это выглядело бы примерно так:
DropdownButton<String>(
value: dropdownValue,
items: <String>[
'Value 1',
'Value 2',
].map<DropdownMenuItem<String>>((String value) {
return DropdownMenuItem<String>(
value: value,
child: Text(value),
);
}).toList(),
onChanged: (String? newValue) {
setState(() {
dropdownValue = newValue!;
if (dropdownValue == 'Value 2') {
dropdownValue = 'Value Not in list of items';
}
});
},
),
Как видите, я, конечно, получаю сообщение об ошибке, если устанавливаю
dropdownValue = 'Value Not in list of items';
так как его нет в списке - но хотелось бы, чтобы он работал :)
С другой стороны, это работает, как и ожидалось:
if (dropdownValue == 'Value 2') {
dropdownValue = 'Value 1';
}
в виде
'Value 1'
находится в списке, но я хотел бы отображать значение, которого нет в списке, когда я нажимаю на
Value 2
Я надеюсь, что кто-то может помочь ! :)
[вот ошибка в целях SEO]:
Assertion failed:
../…/material/dropdown.dart:880
items == null ||
items.isEmpty ||
value == null ||
items.where((DropdownMenuItem<T> item) {
return item.value == value;
}).length ==
1
"There should be exactly one item with [DropdownButton]'s value: Value Not in list of items. \nEither zero or 2 or more [DropdownMenuItem]s were detected with the same value"
2 ответа
Если вы просто хотите отобразить текст, когда
Value 2
выбрано, вы можете попробовать виджет.
String hintValue = 'Select Value'; // ---- hint
var dropdownValue;
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: Column(
children: [
ElevatedButton(child: Text('Press here'), onPressed: null), // ---- ignore
DropdownButton<String>(
value: dropdownValue,
hint: Text(hintValue), // ---- hint
isExpanded: true,
items: <String>[
'Value 1',
'Value 2',
].map<DropdownMenuItem<String>>((String value) {
return DropdownMenuItem<String>(
value: value,
child: Text(value),
);
}).toList(),
onChanged: (newValue) {
setState(() {
// ----- if Value 2 is selected
if (newValue == 'Value 2') {
hintValue = 'Value Not in list of items';
} else
hintValue = '$newValue';
});
},
),
],
));
}
Выход
Примечание : документация по использованию
hint
виджет
Я так поступил, дело в том, что нам нужно убедиться, что
Item[current] == selected item.
import 'package:flutter/material.dart';
class MyStatefulWidget extends StatefulWidget {
const MyStatefulWidget({Key? key}) : super(key: key);
@override
State<MyStatefulWidget> createState() => _MyStatefulWidgetState();
}
class _MyStatefulWidgetState extends State<MyStatefulWidget> {
String dropdownValue = 'Value 1';
List<String> values = [
'Value 1',
'Value 2',
];
@override
Widget build(BuildContext context) {
return Scaffold(
body: DropdownButton<String>(
value: dropdownValue,
onChanged: (String? newValue) {
setState(
() {
if (newValue == 'Value 2') {
values[1] = 'Value Not in list of items';
dropdownValue = 'Value Not in list of items';
}
if (newValue == 'Value 1') {
dropdownValue = 'Value 1';
values[1] = 'Value 2';
}
},
);
},
items: values.map<DropdownMenuItem<String>>((String value) {
return DropdownMenuItem<String>(
value: value,
child: Text(value),
);
}).toList(),
),
);
}
}