DropDownButton из базы данных, выбор не работает, и список не обновляется - PullRequest
0 голосов
/ 30 мая 2020

На домашней странице приложения, которое я пытаюсь создать, находится 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(),

    );
  }

, но в результате я не смог выбрать другой элемент из списка, и подсказка была не отображается. Заранее спасибо за вашу помощь. Если что-то непонятно, дайте знать

...