【问题标题】:Flutter, DropDownButton Either zero or 2 or more [DropdownMenuItem]s were detected with the same valueFlutter、DropDownButton 检测到 0 个或 2 个或多个 [DropdownMenuItem] 具有相同的值
【发布时间】:2020-11-23 13:14:38
【问题描述】:

我是 Flutter 的新手,我正在尝试制作一个 Dropdownbuttom 项目,用户可以在其中从列表中选择一个项目(我从 FirebaseFirestore 获取),如果用户获取该项目,并使用按钮,其他用户将无法使用该项目。

这是我保存按钮中onPress() 函数的方法。

Future saveData(String uid, String enrollment) async {
    // Limpiar la matricula donde aparezca el usuario.
    final querySnapshot =
        await FirebaseFirestore.instance.collection('Matriculas').get();
    final enrollmentOld = querySnapshot.docs.firstWhere(
      (doc) => doc['infoCoche']['idUser'] == uid,
      orElse: () => null,
    );

    if (enrollmentOld != null) {
      try {
        FirebaseFirestore.instance
            .collection('Matriculas')
            .doc(enrollmentOld.id)
            .update({
          'infoCoche': {'idUser': uid, 'enUso': false}
        });
      } catch (e) {
        print(e.toString());
      }
    }

    //Update en la nueva matricula con el nuevo usuario
    try {
      FirebaseFirestore.instance
          .collection('Matriculas')
          .doc(enrollment)
          .update({
        'infoCoche': {'idUser': uid, 'enUso': true}
      });
    } catch (e) {
      print(e.toString());
    }
  }

首先我搜索用户是否已经选择了一个注册,所以如果他想更改为另一个,我可以释放旧的。如果是这样,我将布尔 enUso 设置为 false。对他选择但真实的项目执行相同的操作。如果不这样做,我只是忽略该部分并将新注册的属性更改为 true。

这是DropDownButton

  var _currentItemSelected;

  Widget _formSelectEnrollment() {
    return StreamBuilder(
      stream: FirebaseFirestore.instance.collection('Matriculas').snapshots(),
      builder: (context, AsyncSnapshot<QuerySnapshot> snapshot) {
        if (!snapshot.hasData) {
          return Center(
            child: CircularProgressIndicator(),
          );
        }

        List<DocumentSnapshot> docs = snapshot.data.docs;
        List<String> listEnrollment = List();
        
        for (DocumentSnapshot ids in docs) {
          if (!ids['infoCoche']['enUso']) {
            listEnrollment.add(ids.id);
          }
        }

        return Container(
          margin: EdgeInsets.symmetric(vertical: 10),
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.start,
            children: <Widget>[
              Text(
                'Seleccionar matricula',
                style: TextStyle(fontWeight: FontWeight.bold, fontSize: 15),
              ),
              SizedBox(
                height: 10,
              ),
              DropdownButtonFormField<String>(
                items: listEnrollment.map((String dropDownStringItem) {
                  return DropdownMenuItem<String>(
                    value: dropDownStringItem,
                    child: Text(dropDownStringItem),
                  );
                }).toList(),
                validator: (value) => value == null
                    ? 'Es necesario seleccionar una matricula'
                    : null,
                onChanged: (String newValueSelected) {
                  setState(() {
                    _currentItemSelected = newValueSelected;
                  });
                },
                decoration: InputDecoration(
                    border: InputBorder.none,
                    fillColor: Color(0xfff3f3f4),
                    filled: true),
              )
            ],
          ),
        );
      },
    );
  }

如您所见,我使用的是StreamBuilder(),因此我得到了一个列表,其中包含所有未使用的注册。另外由于它是一个流构建器,如果我在 FireStore 中更改某些内容,它会实时更改。

但是,出于某种我并不关心的原因,每次我尝试选择一个新的注册并保存它时,它都会返回下一个错误。

Performing hot reload...                                                
Reloaded 4 of 838 libraries in 282ms.
I/flutter (17066): ══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
I/flutter (17066): The following assertion was thrown building Builder(dirty, dependencies: [_FocusMarker]):
I/flutter (17066): There should be exactly one item with [DropdownButton]'s value: 5816KNK.
I/flutter (17066): Either zero or 2 or more [DropdownMenuItem]s were detected with the same value
I/flutter (17066): 'package:flutter/src/material/dropdown.dart':
I/flutter (17066): Failed assertion: line 834 pos 15: 'items == null || items.isEmpty || value == null ||
I/flutter (17066):               items.where((DropdownMenuItem<T> item) {
I/flutter (17066):                 return item.value == value;
I/flutter (17066):               }).length == 1'
I/flutter (17066):
I/flutter (17066): Either the assertion indicates an error in the framework itself, or we should provide substantially
I/flutter (17066): more information in this error message to help you determine and fix the underlying cause.
I/flutter (17066): In either case, please report this assertion by filing a bug on GitHub:
I/flutter (17066):   https://github.com/flutter/flutter/issues/new?template=BUG.md
I/flutter (17066):
I/flutter (17066): The relevant error-causing widget was:
I/flutter (17066):   DropdownButtonFormField<String>
I/flutter (17066):   file:///C:/Users/Sharki/Documents/4.%20Proyecto%20flutter/Pruebas%20Flutter/Asereje/lib/paginas/accountSettings.dart:55:15
I/flutter (17066): 
I/flutter (17066): When the exception was thrown, this was the stack:
I/flutter (17066): #2      new DropdownButton (package:flutter/src/material/dropdown.dart:834:15)
I/flutter (17066): #3      new DropdownButtonFormField.<anonymous closure>.<anonymous closure> (package:flutter/src/material/dropdown.dart:1525:27)
I/flutter (17066): #4      Builder.build (package:flutter/src/widgets/basic.dart:7183:48)
I/flutter (17066): #5      StatelessElement.build (package:flutter/src/widgets/framework.dart:4701:28)
I/flutter (17066): #6      ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4627:15)
I/flutter (17066): #7      Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
I/flutter (17066): #8      StatelessElement.update (package:flutter/src/widgets/framework.dart:4708:5)
I/flutter (17066): #9      Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
I/flutter (17066): #10     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6125:14)
I/flutter (17066): #11     Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
I/flutter (17066): #12     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4652:16)
I/flutter (17066): #13     Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
I/flutter (17066): #14     ProxyElement.update (package:flutter/src/widgets/framework.dart:4987:5)
I/flutter (17066): #15     _InheritedNotifierElement.update (package:flutter/src/widgets/inherited_notifier.dart:183:11)
I/flutter (17066): #16     Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
I/flutter (17066): #17     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4652:16)
I/flutter (17066): #18     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4800:11)
I/flutter (17066): #19     Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
I/flutter (17066): #20     StatefulElement.update (package:flutter/src/widgets/framework.dart:4832:5)
I/flutter (17066): #21     Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
I/flutter (17066): #22     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4652:16)
I/flutter (17066): #23     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4800:11)
I/flutter (17066): #24     Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
I/flutter (17066): #25     StatefulElement.update (package:flutter/src/widgets/framework.dart:4832:5)
I/flutter (17066): #26     Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
I/flutter (17066): #27     RenderObjectElement.updateChildren (package:flutter/src/widgets/framework.dart:5647:32)
I/flutter (17066): #28     MultiChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6246:17)
I/flutter (17066): #29     Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
I/flutter (17066): #30     SingleChildRenderObjectElement.update (package:flutter/src/widgets/framework.dart:6125:14)
I/flutter (17066): #31     Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
I/flutter (17066): #32     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4652:16)
I/flutter (17066): #33     Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
I/flutter (17066): #34     StatelessElement.update (package:flutter/src/widgets/framework.dart:4708:5)
I/flutter (17066): #35     Element.updateChild (package:flutter/src/widgets/framework.dart:3314:15)
I/flutter (17066): #36     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4652:16)
I/flutter (17066): #37     StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4800:11)
I/flutter (17066): #38     Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
I/flutter (17066): #39     BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2730:33)
I/flutter (17066): #40     WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:913:20)
I/flutter (17066): #41     RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:302:5)
I/flutter (17066): #42     SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1117:15)
I/flutter (17066): #43     SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1055:9)
I/flutter (17066): #44     SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:971:5)
I/flutter (17066): #48     _invoke (dart:ui/hooks.dart:251:10)
I/flutter (17066): #49     _drawFrame (dart:ui/hooks.dart:209:3)
I/flutter (17066): (elided 5 frames from class _AssertionError and dart:async)
I/flutter (17066):
I/flutter (17066): ════════════════════════════════════════════════════════════════════════════════════════════════════

正如我所说,我真的是 Flutter 的新手,也对不起我的英语。

【问题讨论】:

    标签: flutter dart


    【解决方案1】:

    问题出在 DropDown 项目构建器中

    这里

     listEnrollment.map((String dropDownStringItem) {
                      return DropdownMenuItem<String>(
                        value: dropDownStringItem,
                        child: Text(dropDownStringItem),
                      );
    

    你必须在这里有不同的 dropDownStringItem 值 根据这个错误

    检测到 0 个或 2 个或多个 [DropdownMenuItem] 具有相同的值

    所以检查listEnrollement 中的值你可能会在那之后解决这个问题

    还要检查 listEnrollement 在构建时是否为空

    【讨论】:

    • 可能是当我将属性enUso 设置为true 时,流生成器正在从列表中取出该项目,因此有zero 值为5816KNK 的项目?如果是这样,我该如何解决?
    猜你喜欢
    • 2020-05-12
    • 2023-01-26
    • 1970-01-01
    • 2023-02-16
    • 2011-09-29
    • 2022-08-17
    • 2015-11-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多