Flutter — почему я не вижу данные внутри выпадающего списка

#flutter

#flutter

Вопрос:

Я новичок в Flutter, и я не могу понять, почему я не вижу данные внутри DropDownButton, даже если в списках, которые я использую для создания DropDownButton, есть данные внутри них. Кто-нибудь может объяснить мне, почему это происходит? Единственная подсказка, которая у меня есть, заключается в том, что DropDownButton запускает создание до того, как я создам список, из которого берутся данные.

Проблема в том, что мой выпадающий список пуст.

Я предоставляю весь код ниже.

Код :

 import 'package:flutter/material.dart';

import 'ListOfClienti.dart';

class CreateClient extends StatefulWidget {
  @override
  _CreateClientState createState() => _CreateClientState();
}

class _CreateClientState extends State<CreateClient> {
  String ClientCod = '';
  String currentClient = '';
  List<String> listNameOfClients = [];
  List<DropdownMenuItem<String>> actualList2 = [];

  void getClientsName() {
    for (var i = 0; i <= ListDatabase.length - 1; i  ) {
      var name = ListDatabase[i].nome;
      print(name);
      listNameOfClients.add(name);
    }
  }

  void createListWithClientName() {
    for (String oneByOneClient in listNameOfClients) {
      var VariableToInsert2 = DropdownMenuItem(
        child: Text(oneByOneClient),
        value: oneByOneClient,
      );
      actualList2.add(VariableToInsert2);
    }
  }

  //Method that allows me to create the DropDownButton
  DropdownButton<String> createNameMachine() {
    return DropdownButton(
      items: actualList2,
      style: TextStyle(
        color: Colors.black,
        fontFamily: 'Keqima',
        fontSize: 15,
      ),
      value: currentClient,
      onChanged: (clientSelected) {
        setState(() {
          currentClient = clientSelected;
        });
      },
    );
  }

  @override
  Widget build(BuildContext context) {
    return Container(
      color: Color(0xff757575),
      child: Container(
        decoration: BoxDecoration(
          color: Colors.white,
          borderRadius: BorderRadius.only(
            topLeft: Radius.circular(20),
            topRight: Radius.circular(20),
          ),
        ),
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.center,
          children: <Widget>[
            Padding(
              padding: EdgeInsets.all(16),
              child: TextField(
                decoration: InputDecoration(
                  border: OutlineInputBorder(),
                  labelText: 'Inserisci il codice cliente',
                ),
                onChanged: (textInsideTheField) {
                  ClientCod = textInsideTheField;
                },
              ),
            ),
            Padding(
              padding: EdgeInsets.all(16),
              child: Row(
                children: <Widget>[
                  FlatButton(
                    onPressed: () {
                      getClientsName();
                      createListWithClientName();
                      print(actualList2.length);
                    },
                    child: Text(
                      'Clienti : ',
                      style: TextStyle(
                        fontSize: 20,
                        fontFamily: 'Keqima',
                      ),
                    ),
                  ),
                  SizedBox(
                    width: 20,
                  ),
                  createNameMachine(),
                ],
              ),
            ),
          ],
        ),
      ),
    );
  }
}
  

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

1. Во-первых, в вашем getClientsName методе они есть так, var name = ListDatabase[i].nome как и должно быть .name

2. Кроме того, вы, похоже, не ListDatabase создали, если это не где-то еще в коде, который не показан

3. Нет, это нормально, это должно быть .nome, поскольку в списке<Клиенты> есть поле » .nome » . Проблема не в этом.

4. Да, как вы можете видеть, я импортировал ListOfClients, и внутри него у меня есть база данных ListDatabase

5. 2 метода выполняют свою работу очень хорошо, 3 метода, который создает раскрывающуюся кнопку, является проблемой

Ответ №1:

Чтобы решить эту проблему, мне пришлось изменить на things :

  1. Дело в том, что мне пришлось изменить список из этого списка listNameOfClients = []; в этот список listNameOfClients = [«];

  2. Мне пришлось интегрировать setState и inside для вызова функций.

    setState(() { getClientsName(); createListWithClientName(); });