嗨,我是新来的人
我使用ListView.Builder做这样的事情:
我使用两个小部件,一个用于获取地址信息,另一个用于向ListView添加新地址项
我使用回调通知已按下添加IconButton,但收到错误消息:只能在初始化程序中访问静态成员。当我调用 addItemToList()方法时
这是代码:
class TestPage2 extends StatefulWidget {
@override
_TestPage2State createState() => _TestPage2State();
}
class _TestPage2State extends State<TestPage2> {
List<Widget> lwidgets = [
_Adresses(),
_HorizontalDivider(),
_AddElement(() {
addItemToList();
})
];
void addItemToList() {
setState(() {
lwidgets.insert(lwidgets.length - 1, _Adresses());
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Contacts'),
),
backgroundColor: Color(0xFFE5E5EA),
body: Column(
children: <Widget>[
Text('ADRESS'),
Container(
height: 200,
child: ListView.builder(
itemCount: lwidgets.length,
itemBuilder: (BuildContext context, int index) {
return (lwidgets[index]);
},
physics: NeverScrollableScrollPhysics(),
),
),
],
),
);
}
}
这是_AddElement小部件:
class _AddElement extends StatelessWidget {
final Function() onAddItem;
const _AddElement(this.onAddItem);
@override
Widget build(BuildContext context) {
return Container(
height: 40,
color: Colors.white,
child: Row(
children: <Widget>[
Container(
height: 40,
color: Colors.white,
child: IconButton(
icon: Icon(Icons.add_circle),
iconSize: 24,
color: Color(0xFF34C759),
onPressed: () {
onAddItem();
},
),
),
],
),
);
}
}
我希望当我点击绿色按钮时,新项目将像这样添加到ListView:
我将不胜感激。
Jose Rodriguez
答案 0 :(得分:0)
我已经根据您的代码进行了一些修改。您没有包含其他小部件,例如_Address,所以我添加了一个简单的示例进行演示
您可以在列表视图构建器上执行if语句来检查其最后一个索引,而不是将addelement小部件添加到列表中。在最后一个索引上,返回由_Address和addelement小部件组成的Column。 请参阅所附图片和代码。
让我知道这是否有帮助
List<Widget lwidgets = [_Address()]
void addItemToList() {
setState(() {
lwidgets.add(_Address());
});
}
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Contacts'),
),
backgroundColor: Color(0xFFE5E5EA),
body: Container(child: Column(
children: <Widget>[
Text('ADDRESS'),
Container(
height: 200,
child: ListView.builder(
// separatorBuilder: (context, index) => Divider(
// indent: 0,
// endIndent: 0,
// ),
itemCount: lwidgets.length,
itemBuilder: (BuildContext context, int index) {
//If its the last index of the lwidget list, append _AddElement under the _addresswidget
return index == lwidgets.length - 1
? Column(
children: <Widget>[
_Address(),
_AddElement(addItemToList),
],
)
: _Address();
},
physics: NeverScrollableScrollPhysics(),
),
),
],
),)
);
}
}
class _AddElement extends StatelessWidget {
final Function() onAddItem;
const _AddElement(this.onAddItem);
@override
Widget build(BuildContext context) {
return Container(
height: 40,
color: Colors.white,
child: Row(
children: <Widget>[
Container(
height: 40,
color: Colors.white,
child: IconButton(
icon: Icon(Icons.add_circle),
iconSize: 24,
color: Color(0xFF34C759),
onPressed: () {
onAddItem();
},
),
),
],
),
);
}
}
class _Address extends StatelessWidget {
const _Address();
@override
Widget build(BuildContext context) {
return Container(
height: 40,
color: Colors.white,
child: Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: <Widget>[
Icon(Icons.delete),
Text('Street Name'),
Text("postal code"),
],
),
);
}
}
答案 1 :(得分:0)
这是另一种方式:
我只将一个 _Adress 小部件放置到小工具中,并使用 initState 放置了 AddElement 小部件
之前
List<Widget> lwidgets = [
_Adresses(),
_HorizontalDivider(),
_AddElement(() {
addItemToList();
})
];
void addItemToList() {
setState(() {
lwidgets.insert(lwidgets.length - 1, _Adresses());
});
}
之后
List<Widget> lwidgets = [
_Adress(),
];
@override
void initState() {
lwidgets.insert(lwidgets.length, _AddElement(() => {addItemToList()}));
super.initState();
}
void addItemToList() {
setState(() {
lwidgets.insert(lwidgets.length - 1, _Adress());
});
}
然后将 _HorizontalDivider()放入 _Adress 小部件