我猜想我缺少一些简单的东西,但是我已经尝试了所有可能的解决方案已有好几天了。我们如何处理listview.builder中的下拉选择?是否可以将下拉按钮值存储在List-String-中?
我正在基于XML模板创建动态表单,并且具有下拉菜单,复选框,输入等。编辑:我不知道然后需要什么小组件,直到页面加载时解析XML。 。因此,尝试将动态创建的小部件列表传递给Listview.builder。
以下代码是无法更新的基本示例。
在这里感谢任何建议。
myList = ["a00", "b000", "c0"]
"a00" in myList
# True
"a" in myList
# False
答案 0 :(得分:0)
遵循代码的效果很好。因为SetSate
再次调用Build方法,并且DropdownButton
再次被绘制。在您的代码中,DropdownButton
放在_widgets [0]值上,并且该值在整个代码周期内保持静态。即使在调用SetState
之后,它也会保持不变-因为SetState
不会更新_widgets [0]值-它只会再次调用Build Method。
@override
Widget build(BuildContext context) {
return new Scaffold(
body: new ListView.builder(
itemCount: _widgets.length,
itemBuilder: (context, index) {
return DropdownButton<String>(
value: _listValues[0],
items: _items,
onChanged: (newValue) {
setState(() {
_listValues[0] = newValue;
});
},
);
},
));
}
答案 1 :(得分:0)
我最终用statefulbuilder封装了每个下拉窗口小部件(在List<Widget>
中),因此当从每个窗口小部件调用setstate时,仅该窗口小部件被更新,但是如果需要,仍然可以遍历整个树。这样,就可以按照anmol.majhail注释从构建中调用setState。
import 'package:flutter/material.dart';
class FormEG extends StatefulWidget {
@override
_FormEGState createState() => new _FormEGState();
}
class _FormEGState extends State<FormEG> {
List<String> _listValues;
List<DropdownMenuItem<String>> _items;
List<Widget> _widgets;
@override
void initState() {
_listValues = new List<String>();
setDefaults();
setWidgets();
super.initState();
}
@override
Widget build(BuildContext context) {
print("built");
return new Scaffold(
body: new ListView.builder(
itemCount: _widgets.length,
itemBuilder: (context, index) {
return _widgets[index];
},
));
}
void setDefaults() {
_listValues.add("b");
}
void setWidgets() {
setMenuItems();
_widgets = new List<Widget>();
_widgets.add(
new StatefulBuilder(
builder: (BuildContext context, StateSetter setState) {
return new DropdownButton<String>(
value: _listValues[0],
items: _items,
onChanged: (String newValue) {
setState(() {
_listValues[0] = newValue;
});
},
);
},
),
);
}
void setMenuItems() {
_items = new List<DropdownMenuItem<String>>();
_items.add(new DropdownMenuItem(child: Text("a"), value: "a"));
_items.add(new DropdownMenuItem(child: Text("b"), value: "b"));
_items.add(new DropdownMenuItem(child: Text("c"), value: "c"));
_items.add(new DropdownMenuItem(child: Text("d"), value: "d"));
}
}
答案 2 :(得分:0)
您可以尝试仅使用列表并动态更新列表,然后再更新setState。
ListView(
shrinkWrap: true,
scrollDirection: Axis.vertical,
children: dropDownList),
),
然后根据触发器/事件对其进行更新。
_buildDropDownList() {
if (dropDownEnabled) {
setState (() {
dropDownList.addAll([1,2,,4,5])
});
} else {
setState (() {
dropDownList = [];
});
}