从 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以上是关于从 DropdownItems 中选择值后,DropdownButton 值未更新。如何使用 selectedValue 更新默认值?的主要内容,如果未能解决你的问题,请参考以下文章
用户从 xcode 中的多组件选择器中选择某些值后,如何显示某个消息/警报?