【发布时间】:2018-10-10 02:26:06
【问题描述】:
我一直在缓慢地使用 Flutter 构建应用程序,并且正在努力在 StatefulWidget/State 范式下工作。
我习惯于从其他类中读取或更改某些 UI 组件的状态,但不太了解如何在 Flutter 中执行此操作。例如,现在我正在构建一个包含 CheckBoxListTiles 的 ListView。我想从另一个班级查看并阅读列表图块中每个复选框的状态。
我觉得这在实践中应该非常简单,但我无法想出一种方法或示例来有效地将给定 Widget 的状态外部化,以便可以在其他地方使用它。我知道在明显的困难背后很可能有一个有意的和哲学的原因,并且我自己可以看到为什么它在诸如 Flutter 这样的框架中至关重要。但是,我觉得受到限制,因为对于新手来说,如何立即在范式下进行工作并不明显。
如何从 ItemsList 类中读取复选框的值?
物品类:
class ListItem extends StatefulWidget {
String _title = "";
bool _isSelected = false;
ListItem(this._title);
@override
State<StatefulWidget> createState() => new ListItemState(_title);
}
class ListItemState extends State<ListItem> {
String _title = "";
bool _isSelected = false;
ListItemState(this._title);
@override
Widget build(BuildContext context) {
return new CheckboxListTile(
title: new Text(_title),
value: _isSelected,
onChanged: (bool value) {
setState(() {
_isSelected = value;
});
},
);
}
String getTitle() {
return _title;
}
bool isSelected() {
return _isSelected;
}
@override
void initState() {
super.initState();
}
@override
void dispose() {
super.dispose();
}
}
还有列表类:
class ItemsList extends StatefulWidget {
@override
State<StatefulWidget> createState() => new ItemsListState();
}
class ItemsListState extends State<ItemsList> {
List<ListItem> _items = new List();
@override
Widget build(BuildContext context) {
return new Scaffold(
body: new ListView(
children: _items.map((ListItem item) {
return item;
}).toList(),
),
floatingActionButton: new FloatingActionButton(
onPressed: addItem,
child: new Icon(Icons.add),),
);
}
void addItem() {
setState(() {
_items.add(new ListItem("Item"));
});
}
List<String> getSelectedTitles() {
List<String> selected = new List();
***This is where I would like to externalize the state***
for(ListItem e in _items) {
if(e.isSelected()) {
selected.add(e.getTitle());
}
}
return selected;
}
@override
void initState() {
super.initState();
}
@override
void dispose() {
super.dispose();
}
}
【问题讨论】: