flutter - ListView Builder 在初始化器中只能访问静态成员
问题描述
嗨,我是 Flutter 的新手
我使用 ListView.Builder 来做这样的事情:
我使用两个小部件,一个用于地址信息,一个用于将新地址项添加到 ListView
我使用回调通知 add 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 中,如下所示:
我将不胜感激。
何塞·罗德里格斯
解决方案
我根据你的代码做了一些修改。您没有包含其他小部件,例如 _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"),
],
),
);
}
}
推荐阅读
- python - 如何使用正则表达式和python在字符串中查找特定文本
- haskell - 如何在 WSL 上运行堆栈 ghci?
- openssl - 由于 mac 上的 openssl 错误,无法安装纱线
- c++ - C++:*p = &a 与 &p = a
- python - 如何在 Pyspark 列中搜索字符串并有选择地用变量替换一些字符串(包含特定子字符串)?
- python - Matplotlib 将黑白图像显示为灰色
- bash - 在 bash 脚本中使用 awk 变量
- python - Python:线程停止工作而不会引发任何错误
- r - R Markdown 中的错误:找不到函数“split_chain”
- mongodb - 如何使用猫鼬模式填充