Создание выпадающего списка на основе списка внутри нижней таблицы во флаттере - PullRequest
0 голосов
/ 09 октября 2019

В моем коде я анализирую Json и создаю список карт, и для каждой карты я хочу отображать их в раскрывающемся списке.

вот мой код

import 'package:flutter/material.dart';

class ReportFilter extends StatefulWidget {
  final Map jsonString;
  var globalData;

  ReportFilter({@required this.jsonString, this.globalData});

  @override
  _ReportFilterState createState() => _ReportFilterState();
}

class _ReportFilterState extends State<ReportFilter> {
  List<TextEditingController> controllers = [];
  TextEditingController controller;
  Map<String, Object> globalValues = Map<String, Object>();

  String type;
  int optionId;

  @override
  void initState() {
    globalValues = widget.globalData;
    super.initState();
  }

  @override
  Widget build(BuildContext context) {
    return Container(
      child: SingleChildScrollView(
          child: Column(
        children: <Widget>[
          Align(
              alignment: Alignment.topRight,
              child: FlatButton.icon(
                label: Text('Filters'),
                icon: Icon(Icons.filter_list),
                onPressed: () => showModalSheet(),
              )),
        ],
      )),
    );
  }

  showModalSheet() {
    List<Map<String, Object>> dropdownList = List<Map<String, Object>>();

       // here I am fetching data from json and doing some operations and storing the result into the List of maps, i.e dropdownList
// below I showed the contents of the dropdownList, and I am passing this list to the Dropdown menu. The contents of the list is dynamic and it keeps changing, It may contains any no of type value as String in  map, or List in map

    showModalBottomSheet<void>(
        shape: RoundedRectangleBorder(
          borderRadius: BorderRadius.circular(10.0),
        ),
        context: context,
        builder: (BuildContext context) {
          return StatefulBuilder(
              builder: (BuildContext context, StateSetter state) {
              return createBox(context, dropdownList, state);

          });
        });
  }

  createBox(BuildContext context, List<Map<String, Object>> val,
      StateSetter setState) {
    Widget supporting = buildSupportingWidget(val, setState);
    return SingleChildScrollView(
        child: LimitedBox(
            maxHeight: 300,
            child: Column(
                mainAxisSize: MainAxisSize.max,
                mainAxisAlignment: MainAxisAlignment.center,
                children: <Widget>[
                  buildMainDropdown(val, setState),
                  if (supporting != null) supporting
                ])));
  }

  Expanded buildMainDropdown(
      List<Map<String, Object>> items, StateSetter setState) {
    return Expanded(
      child: DropdownButtonHideUnderline(
        child: DropdownButton(
          value: type,
          hint: Text("Select a type"),
          items: items
              .map((json) => DropdownMenuItem(
                  child: Text(json["displayName"]), value: json["type"]))
              .toList(),
          onChanged: (newType) {
            setState(() {
              type = newType;
            });
          },
        ),
      ),
    );
  }

  Widget buildSupportingWidget(
      List<Map<String, Object>> items, StateSetter setState) {
    if (type == "list") {
      List<Map<String, Object>> options = items[1]["data"];
      return Expanded(
        child: DropdownButtonHideUnderline(
          child: DropdownButton(
            value: optionId,
            hint: Text("Select an entry"),
            items: options
                .map((option) => DropdownMenuItem(
                    child: Text(option["displayId"]), value: option["id"]))
                .toList(),
            onChanged: (newId) => setState(() {
              this.optionId = newId;
            }),
          ),
        ),
      );
    } else if (type == "string") {
      return Expanded(child: TextFormField());
    }
    return null;
  }
}

На листе показа модели я выполняю некоторые операции для получения списка карт, поэтому после их выполнения мой dropdownList список содержит такие данные, как

[
      {
        "displayName": "Enter value",
        "type": "string",
      },
      {
        "displayName": "Enter second value",
        "type": "string",
      },
      {
        "id": "si",
        "displayName": "Source",
        "type": "list",
        "value": ["MO"], "searchField": "si",
        "data": [
          {"id": 1, "displayId": "MO"},
          {"id": 2, "displayId": "AO"},
          {"id": 3, "displayId": "OffNet"}
        ]
      }
    ];

Это может быть несколько строк, или списки зависят от Json, который я обрабатываю,

Затем я передаю список, чтобы создать поле, я вызываю функции Dropdown, но я не понимаю, как создатьэти раскрывающиеся списки на основе списка, а также управление окончательными данными после выбора пользователем конкретного элемента,

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

...