listview - Flutter/Dart:处理 ListView.builder 中的下拉更改,下拉按钮不更新,
问题描述
我猜我错过了一些简单的东西,但我已经在这几天尝试了所有可能的解决方案。我们如何处理 listview.builder 中的下拉选择?是否可以将下拉按钮值存储在 List-String- 中?
我正在创建一个基于 XML 模板的动态表单,并具有下拉菜单、复选框、输入等。编辑:在页面加载时解析 XML 之前,我不知道需要哪些小部件。因此尝试将动态创建的小部件列表传递给 Listview.builder。
下面的代码是一个未能更新的基本示例。
在这里欣赏任何建议。
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>();
_listValues.add("b");
_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"));
_widgets = new List<Widget>();
_widgets.add(new DropdownButton<String>(
value: _listValues[0],
items: _items,
onChanged: (String newValue) {
setState(() {
_listValues[0] = newValue;
});
},
));
}
@override
Widget build(BuildContext context) {
return new Scaffold(
body: new ListView.builder(
itemCount: _widgets.length,
itemBuilder: (context, index) {
return _widgets[index];
},
));
}
}
解决方案
我最终List<Widget>
用 statefulbuilder 包装了每个下拉小部件(in ),因此当从每个小部件调用 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"));
}
}
推荐阅读
- powershell - 用于按顺序获取音频曲目列表时间戳的 Powershell 脚本
- excel - 如何使用宏/vba 获取所有工作表名称及其特定单元格值?
- hibernate - Hibernate 使用 join fetch 获取多个关联
- python - Django - 将 SQL 查询解析为 QuerySet
- sql - PostgreSQL 触发器更新所有表而不是行
- angular - 加载了角度事件侦听器文档
- r - 由于反应困难,Shiny 应用程序中的错误
- reactjs - 如何让 Flatlist 将项目滚动到 1
- r - 检查向量在名称列表中是否具有相同的名称,并仅保留验证向量中条件的名称
- javascript - Javascript - 带图片的打字游戏