从 DropdownItems 中选择值后,DropdownButton 值未更新。如何使用 selectedValue 更新默认值?

Posted

技术标签:

【中文标题】从 DropdownItems 中选择值后,DropdownButton 值未更新。如何使用 selectedValue 更新默认值?【英文标题】:DropdownButton value is not updating after selecting values from DropdownItems. How to update default value with selectedValue? 【发布时间】:2019-05-31 08:50:18 【问题描述】:
DropdownButton Value does not update even after selecting different items.

如果默认值为空,则显示错误消息,如果我传递任何默认值(非空),则它永远不会更改为其他选定的值。

currentCategory 被设置为 DropdownButton 的默认值。

StreamBuilder<QuerySnapshot>(
                    stream: Firestore.instance
                        .collection('categories')
                        .snapshots(),
                    builder: (BuildContext context,
                        AsyncSnapshot<QuerySnapshot> snapshot) 
                      currentCategory = snapshot.data.documents[0];
                      return DropdownButtonHideUnderline(
                        child:
                            new DropdownButtonFormField<DocumentSnapshot>(
                          value: currentCategory,
                          onChanged: (DocumentSnapshot newValue) 
                            setState(() 
                              currentCategory = newValue;
                            );
                            print(currentCategory.data['name']);
                          ,
                          onSaved: (DocumentSnapshot newValue) 
                            setState(() 
                              currentCategory = newValue;
                            );
                          ,
                          items: snapshot.data.documents
                              .map((DocumentSnapshot document) 
                            return new DropdownMenuItem<DocumentSnapshot>(
                              value: document,
                              child: Text(
                                document.data['name'],
                              ),
                            );
                          ).toList(),
                        ),
                      );
                    ),

帮我解决这个问题。 提前致谢。

【问题讨论】:

覆盖 initState() 并创建一个 stream 变量,然后在流生成器中设置流值。 【参考方案1】:

触发setState 将安排一个新的build(build 方法总是在收到对setState 的调用后调用)。

因此,我建议您将查询移到小部件之外并在 initState 语句中初始化流,这样就不会在每次状态更改时都计算它(除非您真的需要它)。

还将您的 currentCategory 移到小部件 build 方法之外。

这样的事情应该可以工作:

class YourClass extends StatefulWidget 
  ...


class _YourClassState extends State<YourClass> 

  Stream<QuerySnapshot> _categories;
  DocumentSnapshot _currentCategory;

  initState() 
    _categories = Firestore.instance.collection('categories').snapshots();
    return super.initState();
  

  Widget build(BuildContext context) 
    return Container(
      child: StreamBuilder<QuerySnapshot>(
        stream: _categories,
        builder: (BuildContext context, AsyncSnapshot<QuerySnapshot> snapshot) 
          return DropdownButtonHideUnderline(
            child: new DropdownButtonFormField<DocumentSnapshot>(
              value: _currentCategory,
              onChanged: (DocumentSnapshot newValue) 
                setState(() 
                  _currentCategory = newValue;
                );
              
            )
          )
        
      )
    );
  


另请注意,setState 仅适用于有状态小部件。

【讨论】:

遇到了和他一模一样的问题,使用 FutureBuilder 填充我的下拉菜单,但它没有用。您的解决方案在正确的方向上给了我一个很好的打击,尽管我不得不说使用流/未来构建器让一些事情变得更容易 我也有这个问题【参考方案2】:

这是因为每次您执行 setState 时,即使 currentCategory 已更改,它也会重建您的树并再次返回 currentCategory = snapshot.data.documents[0];,从而为您提供未设置的想法。

将其替换为if(currentCategory == null) currentCategory = snapshot.data.documents[0];,这样只有在满足此条件时才会设置它。

【讨论】:

如果我设置了初始值(如果它等于空),现在会显示此错误消息。在构建 DropdownButtonFormField(dirty, state: _DropdownButtonFormFieldState#b9cd7): 'package:flutter/src/material/dropdown.dart': Failed assertion: line 514 pos 15: 'items == null ||值 == 空 || items.where((DropdownMenuItem item) => item.value == value).length == 1': 不正确。

以上是关于从 DropdownItems 中选择值后,DropdownButton 值未更新。如何使用 selectedValue 更新默认值?的主要内容,如果未能解决你的问题,请参考以下文章

用户从 xcode 中的多组件选择器中选择某些值后,如何显示某个消息/警报?

从数据库中获取值后如何清除 jComboBox

SwiftUI 表单中的选取器在选择一个值后变为灰色

在 MySQL 中选择 MIN 值后选择 MIN (MAX)

设置选定值后,引导选择选择器刷新间歇性工作

修改子组件中的选择值后触发函数 - VueJs