На домашней странице приложения, которое я пытаюсь создать, находится DropDownMenu, элементы которого извлекаются из базы данных, которую вы можете изменить на другой странице. Однако я обнаружил две проблемы: когда вы go вернулись на домашнюю страницу, вам нужно щелкнуть два раза, чтобы обновить элементы, и вторая проблема заключается в том, что когда я выбираю значение, я получаю сообщение об ошибке
════════ Exception caught by widgets library ═══════════════════════════════════
There should be exactly one item with [DropdownButton]'s value: Instance of 'Device'.
Either zero or 2 or more [DropdownMenuItem]s were detected with the same value
'package:flutter/src/material/dropdown.dart':
Failed assertion: line 827 pos 15: 'items == null || items.isEmpty || value == null ||
items.where((DropdownMenuItem<T> item) {
return item.value == value;
}).length == 1'
The relevant error-causing widget was
FutureBuilder<List<Device>>
class Home extends StatefulWidget {
@override
_HomeState createState() => _HomeState();
}
class _HomeState extends State<Home> {
Device selecteddevice;
Future<List<Device>> getdev() async {
dynamic devices = await DBHelper().getDevices();
return devices;
}
menu() {
return FutureBuilder(
future: getdev(),
builder: (context, snapshot) {
if (snapshot.hasData) {
print(snapshot.data);
return dropdownButton(snapshot.data);
}
},
);
}
dropdownButton(List<Device> devices) {
return DropdownButton<Device>(
hint: Text('Select Device'),
value: selecteddevice,
onChanged: (Device selected) {
setState(() {
selecteddevice = selected;
});
},
items: devices.map((Device device) {
return DropdownMenuItem<Device>(
value: device,
child: Text(device.name),
);
}).toList(),
);
}
@override
Widget build(BuildContext context) {
return Scaffold(
body: SafeArea(
child: Column(
children: <Widget>[
Row(
mainAxisAlignment: MainAxisAlignment.end,
children: <Widget>[
IconButton(
icon: Icon(Icons.edit),
onPressed: () {
Navigator.push(
context,
MaterialPageRoute(
builder: (context) => DBTestPage(),
));
},
)
],
),
Row(
mainAxisAlignment: MainAxisAlignment.spaceAround,
children: <Widget>[menu()],
)
],
),
),
);
}
}
Чтобы исправить вторую проблему, я попытался вызвать переменную selecteddevice внутри функции dropdownButton следующим образом:
dropdownButton(List<Device> devices) {
selecteddevice = devices.first;
return DropdownButton<Device>(
hint: Text('Select Device'),
value: selecteddevice,
onChanged: (Device selected) {
setState(() {
selecteddevice = selected;
});
},
items: devices.map((Device device) {
return DropdownMenuItem<Device>(
value: device,
child: Text(device.name),
);
}).toList(),
);
}
, но в результате я не смог выбрать другой элемент из списка, и подсказка была не отображается. Заранее спасибо за вашу помощь. Если что-то непонятно, дайте знать