首页 > 解决方案 > Flutter DropdownButton 值的问题

问题描述

您好,我是 Flutter 的新手,我正在尝试DropdownButton根据 Firebase 后端中的不同文档创建多个 s。由于可能有多个DropdownButton(不同的文档有不同数量的下拉列表要创建),我想用 List<String> formInputformInput[0]保持第一个DropdownButton值等)来维护那里的值。

但是我一直遇到这个错误,并得出结论,这是formInput[i]错误的。所以我的问题是为什么我不能formInput[i]用作下拉按钮的值?不formInput[i]考虑一件?是否有更好的解决方案来维护未知数量的值?

非常感谢

代码:

class _SubmissionFormState extends State<SubmissionForm> {
  List<String> formInput;
  var test;
  @override
  Widget build(BuildContext context) {
    Size size = MediaQuery.of(context).size;
    return FutureBuilder(
      future: getStringFromPref('site'),
      builder: (context, snapshot) {
        if (snapshot.hasData) {
          String site = snapshot.data;
          return StreamBuilder(
              stream: FirebaseFirestore.instance
                  .collection('form')
                  .where('name', isEqualTo: site)
                  .snapshots(),
              builder: (context, snapshot) {
                if (snapshot.hasData) {
                  int inputSize = snapshot.data.documents.length;
                  List<Widget> listOfWidget = [];
                  formInput = new List<String>.filled(inputSize, '-');
                  print(formInput.length);

                  for (int i = 0; i < inputSize; i++) {
                    DocumentSnapshot snap = snapshot.data.documents[i];
                    List<DropdownMenuItem> options = [];
                    // adding drop down menu items
                    for (int j = 0; j < snap['formVal'].length; j++) {
                      String formVal = snap['formVal'][j];
                      options.add(DropdownMenuItem(
                        child: Text(
                          formVal,
                        ),
                        value: formVal,
                      ));
                      print('[inner loop] for loop $i ' + snap['formVal'][j]);
                    }

                    // the list of DropdownButtons
                    listOfWidget.add(DropdownButton(
                      value: formInput[i],
                      items: options,
                      hint: Text(
                        "-",
                      ),
                      onChanged: (value) {
                        setState(() {
                          formInput[i] = value;
                        });
                      },
                    ));

                    // listOfWidget.add(Text(snap['formTxt']));
                  }
                  return Column(
                    children: listOfWidget,
                  );
                } else {
                  return CircularProgressIndicator();
                }
              });
        } else {
          return CircularProgressIndicator();
        }
      },
    );
  }
}

错误:

I/flutter (30860): ══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
I/flutter (30860): The following assertion was thrown building StreamBuilder<QuerySnapshot>(dirty, state:
I/flutter (30860): _StreamBuilderBaseState<QuerySnapshot, AsyncSnapshot<QuerySnapshot>>#60d57):
I/flutter (30860): There should be exactly one item with [DropdownButton]'s value: -.
I/flutter (30860): Either zero or 2 or more [DropdownMenuItem]s were detected with the same value
I/flutter (30860): 'package:flutter/src/material/dropdown.dart':
I/flutter (30860): Failed assertion: line 839 pos 15: 'items == null || items.isEmpty || value == null ||
I/flutter (30860):               items.where((DropdownMenuItem<T> item) {
I/flutter (30860):                 return item.value == value;
I/flutter (30860):               }).length == 1'
I/flutter (30860):

标签: flutterdropdownbutton

解决方案


推荐阅读