ListView Builder 只能在初始化器中访问静态成员
ListView Builder Only static members can be accessed in initializers
嗨,我是 flutter 的新手
我用 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,如下所示:
如有任何帮助,我将不胜感激。
何塞·罗德里格斯
我根据你的代码做了一些修改。您没有包含其他小部件,例如 _Address,所以我添加了一个简单的小部件用于演示
您可以在列表视图生成器上执行 if 语句来检查它是否是最后一个索引,而不是将您的 addelement 小部件附加到列表中。在最后一个索引上,return 一个由 _Address 和 addelement 小部件组成的列。
参考附图和代码。
如果有帮助请告诉我
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"),
],
),
);
}
}
Initiate phase
1 item added
More Item added
这是另一种方法:
我只将一个 _Adress 小部件放入 lwidgets 并使用 initState 将 添加元素 小部件
之前
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 小部件
嗨,我是 flutter 的新手
我用 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,如下所示:
如有任何帮助,我将不胜感激。
何塞·罗德里格斯
我根据你的代码做了一些修改。您没有包含其他小部件,例如 _Address,所以我添加了一个简单的小部件用于演示
您可以在列表视图生成器上执行 if 语句来检查它是否是最后一个索引,而不是将您的 addelement 小部件附加到列表中。在最后一个索引上,return 一个由 _Address 和 addelement 小部件组成的列。 参考附图和代码。
如果有帮助请告诉我
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"),
],
),
);
}
}
Initiate phase
1 item added
More Item added
这是另一种方法:
我只将一个 _Adress 小部件放入 lwidgets 并使用 initState 将 添加元素 小部件
之前
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 小部件