Хобрук: Ваш путь к мастерству в программировании

Элемент поля со списком Flutter в виде списка

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

Я пробовал несколько решений, но ни одно из них, похоже, не работает, поскольку я мог создать поле ввода и добавить элементы вручную, но я не могу сделать это с помощью поля со списком (не позволяя пользователю писать их вручную).

Вот что я сделал:



import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
import 'package:searchable_dropdown/searchable_dropdown.dart';


class LocationTab extends StatefulWidget {
  @override
  _LocationTabState createState() => _LocationTabState();
}

class _LocationTabState extends State<LocationTab> {
  List<String> mylist = List();


  List<ParentCategoryComboBox> _visibility =
      ParentCategoryComboBox.getParentCategory();
  List<DropdownMenuItem<ParentCategoryComboBox>> _dropdownMenuItems;

  List<PlatformReachComboBox> _platformReach =
      PlatformReachComboBox.getPlatformReach();
  List<DropdownMenuItem<PlatformReachComboBox>> _dropdownPlatformReach;

  PlatformReachComboBox _selectedPlatformReach;

  ParentCategoryComboBox _selectedVisibility;

  @override
  void initState() {
    _dropdownMenuItems = buildDropDownMenuItems(_visibility);
    _selectedVisibility = _dropdownMenuItems[0].value;

    _dropdownPlatformReach =
        buildDropdownMenuItemsPlatformReach(_platformReach);
    _selectedPlatformReach = _dropdownPlatformReach[0].value;

    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Container(
      padding: EdgeInsets.only(top: 10.0, left: 20.0, right: 20.0),
      child: SingleChildScrollView(
        physics: BouncingScrollPhysics(),
        scrollDirection: Axis.vertical,
        child: Column(
          children: <Widget>[
            SizedBox(
              height: 20,
            ),
            Column(
              children: [
                Align(
                  alignment: Alignment.centerLeft,
                  child: Text(
                    "Select visibility:",
                    style: TextStyle(
                      color: Colors.indigoAccent,
                      fontWeight: FontWeight.bold,
                      fontSize: 16,
                    ),
                  ),
                ),
              ],
            ),
            DropdownButton(
              icon: Icon(
                Icons.visibility,
                color: Colors.black45,
              ),
              isExpanded: true,
              value: _selectedVisibility,
              items: _dropdownMenuItems,
              onChanged: (ParentCategoryComboBox selectedVisibility) {
                setState(() {
                  _selectedVisibility = selectedVisibility;
                });
              },
            ),
            SizedBox(
              height: 35,
            ),
            Container(
              padding: new EdgeInsets.symmetric(horizontal: 5.0),
              decoration: BoxDecoration(
                  border: Border.all(
                    width: 1,
                    color: Colors.grey,
                  ),
                  borderRadius: BorderRadius.circular((10))),
              child: Column(
                children: <Widget>[
                  SizedBox(
                    height: 10,
                  ),
                  Align(
                    alignment: Alignment.centerLeft,
                    child: Text(
                      "Select platform reach:",
                      style: TextStyle(
                        color: Colors.indigoAccent,
                        fontWeight: FontWeight.bold,
                        fontSize: 16,
                      ),
                    ),
                  ),
                  SizedBox(
                    height: 20,
                  ),
                  Row(
                    children: <Widget>[
                      Expanded(
                        child: SearchableDropdown(
                          isExpanded: true,
                          value: _selectedPlatformReach,
                          items: _dropdownPlatformReach,
                          isCaseSensitiveSearch: false,
                          onChanged:
                              (PlatformReachComboBox selectedPlatformReach) {
                            setState(() {
                              _selectedPlatformReach = selectedPlatformReach;
                            });
                          },
                        ),
                        flex: 2,
                      ),
                      Expanded(
                        child: Container(
                          height: 50.0,
                          width: 80,
                          child: Material(
                            borderRadius: BorderRadius.circular(20.0),
                            shadowColor: Colors.blue,
                            color: Colors.deepPurpleAccent,
                            elevation: 0.0,
                            child: GestureDetector(
                              onTap: () {
                                setState(() {
                                  mylist.add(_selectedPlatformReach.toString());
                                });
                              },
                              child: Center(
                                child: Text(
                                  'ADD',
                                  style: TextStyle(
                                    color: Colors.white,
                                    fontWeight: FontWeight.bold,
                                  ),
                                ),
                              ),
                            ),
                          ),
                        ),
                        flex: 0,
                      ),
                    ],
                  ),
                  SizedBox(
                    height: 10,
                  ),
                  Align(
                    alignment: Alignment.centerLeft,
                    child: Text(
                      "Added:",
                      style: TextStyle(
                        color: Colors.indigoAccent,
                        fontWeight: FontWeight.bold,
                        fontSize: 16,
                      ),
                    ),
                  ),
                  SizedBox(
                    height: 10,
                  ),
                  ListView.builder(
                    padding: EdgeInsets.only(left: 10),
                    scrollDirection: Axis.vertical,
                    shrinkWrap: true,
                    itemCount: mylist.length,
                    itemBuilder: (BuildContext ctxt, int Index) {
                      return Text(
                          mylist[Index]
                      );

                    },
                  ),
//                  ListView.builder(
//                    padding: EdgeInsets.only(left: 10),
//                    scrollDirection: Axis.vertical,
//                    shrinkWrap: true,
//                    itemCount: _platformReach.length,
//                    itemBuilder: (BuildContext ctxt, int Index) {
//                      return Text(
//                        "Galati"
//                      );
////                      return DropdownButton(
////                        value: _selectedPlatformReach.toString(),
////                        items: _dropdownPlatformReach,
////                        onChanged: (value) {
////                          _selectedPlatformReach = value;
////                          setState(() {});
////                        },
////                        hint: Text('Select drowdown'),
////                      );
////                                return new Text(_dropdownPlatformReach[Index].value);
//                    },
//                  ),
                ],
              ),
            ),
          ],
        ),
      ),
    );
  }
}

Класс фиктивных данных:

import 'package:flutter/material.dart';

class PlatformReachComboBox {
  String name;
  String hint;

  PlatformReachComboBox(this.name, this.hint);

  static List<PlatformReachComboBox> getPlatformReach() {
    return <PlatformReachComboBox>[
      PlatformReachComboBox('Jud Galati', '(RO, [Galati] County)'),
      PlatformReachComboBox('Jud Braila', '(RO, [Braila] County)'),
      PlatformReachComboBox('Jud Prahova', '(RO, [Ploiesti] County)'),
      PlatformReachComboBox('Jud Maramures', '(RO, [Baia Mare] County)'),
    ];
  }
}

List<DropdownMenuItem<PlatformReachComboBox>>
    buildDropdownMenuItemsPlatformReach(List platforms) {
  List<DropdownMenuItem<PlatformReachComboBox>> items = List();
  for (PlatformReachComboBox platform in platforms) {
    items.add(
      DropdownMenuItem(
        value: platform,
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.start,
          children: <Widget>[
            Text(
              platform.name,
              style: TextStyle(fontWeight: FontWeight.bold),
              textAlign: TextAlign.start,
            ),
            Text(
              platform.hint,
              style:
                  TextStyle(fontWeight: FontWeight.normal, color: Colors.grey),
              textAlign: TextAlign.end,
            )
          ],
        ),
      ),
    );
  }
  return items;
}

И вот здесь я сталкиваюсь с проблемой, я не знаю, что вернуть в ListView для меня, нажав кнопку, а затем элемент, который нужно добавить туда:

   ListView.builder(
                    padding: EdgeInsets.only(left: 10),
                    scrollDirection: Axis.vertical,
                    shrinkWrap: true,
                    itemCount: _platformReach.length,
                    itemBuilder: (BuildContext ctxt, int Index) {
                      return Text(
                        "Galati"
                      );

                    },
                  ),

  • Вы пробовали этот виджет? api.flutter.dev/flutter/material/DropdownButton-class.html 18.09.2020
  • Да, я пробовал, но не смог добавить элементы, выбранные в представлении списка. 18.09.2020
  • пожалуйста, добавьте свой код с этим виджетом... я пытаюсь это исправить... 18.09.2020
  • Я отредактировал код. 18.09.2020
  • опубликуйте минимальный код, который показывает проблему, с которой вы столкнулись - использование внешних сторонних пакетов затрудняет запуск/тестирование/отладку 18.09.2020
  • Я помещаю другую правку, где я указываю, где проблема. 18.09.2020
  • @AlexandruBuruiana единственное представление списка в этом коде (Galaty), не использующее список для отображения ... вы хотите показать выбранные элементы раскрывающегося списка в этом представлении списка? 18.09.2020
  • Да, я хочу показать выбранные элементы в виде списка. Я хочу сначала выбрать что-то из поля со списком ->, затем нажать добавить->, а затем конкретный элемент, который появится в списке. @mohandesR 18.09.2020
  • _platformReach уже хранит данные. Я не понимаю часть метода build . 18.09.2020
  • _platformReach.map((e) => Text(_selectedPlatformReach.toString())).toList(); что это должно делать? вы создаете какой-то List, который нигде не используется 18.09.2020
  • Эта часть кода не работает должным образом, она ничего не делает. 18.09.2020

Ответы:


1

пожалуйста, попробуйте так... определите список

List<String> mylist = List();

и используйте его ниже

   ListView.builder(
                padding: EdgeInsets.only(left: 10),
                scrollDirection: Axis.vertical,
                shrinkWrap: true,
                itemCount: mylist.length,
                itemBuilder: (BuildContext ctxt, int Index) {
                  return Text(
                    mylist[Index]
                  );

                },
              ),

и после нажатия кнопки

setState(() {
   mylist.add(_selectedVisibility.name);
});
18.09.2020
  • Я пробовал, но при нажатии на кнопку "Добавить" я получаю эту ошибку: The argument type 'PlatformReachComboBox' can't be assigned to the parameter type 'String'. Я пытался добавить .toString() в конце, и в приложении я получаю следующее сообщение: Instance of 'PlatformReachComboBox вместо элемента из поля со списком. 18.09.2020
  • @AlexandruBuruiana я изменил эту часть mylist.add(_selectedVisibility.name); 18.09.2020
  • Новые материалы

    Создание кнопочного меню с использованием HTML, CSS и JavaScript
    Вы будете создавать кнопочное меню, которое имеет состояние наведения, а также позволяет вам выбирать кнопку при нажатии на нее. Финальный проект можно увидеть в этом Codepen . Шаг 1..

    Внедрите OAuth в свои веб-приложения для повышения безопасности
    OAuth — это широко распространенный стандарт авторизации, который позволяет приложениям получать доступ к ресурсам от имени пользователя, не раскрывая его пароль. Это позволяет пользователям..

    Классы в JavaScript
    class является образцом java Script Object. Конструкция «class» позволяет определять классы на основе прототипов с чистым, красивым синтаксисом. // define class Human class Human {..

    Как свинг-трейдеры могут использовать ИИ для больших выигрышей
    По мере того как все больше и больше профессиональных трейдеров и активных розничных трейдеров узнают о возможностях, которые предоставляет искусственный интеллект и машинное обучение для улучшения..

    Как построить любой стол
    Я разработчик программного обеспечения. Я люблю делать вещи и всегда любил. Для меня программирование всегда было способом создавать вещи, используя только компьютер и мое воображение...

    Обзор: Машинное обучение: классификация
    Только что закончил третий курс курса 4 часть специализации по машинному обучению . Как и второй курс, он был посвящен низкоуровневой работе алгоритмов машинного обучения. Что касается..

    Разработка расширений Qlik Sense с qExt
    Использование современных инструментов веб-разработки для разработки крутых расширений Вы когда-нибудь хотели кнопку для установки переменной в приложении Qlik Sense? Когда-нибудь просили..