我是Flutter的新手,我正在尝试构建一个相当简单的应用程序。我有这个简单的(仍在进行中)代码,我试图在用户每次单击按钮时添加一个新的Widget。
下面是我的代码:
class ResponsavelProfilePage extends StatefulWidget {
@override
_ResponsavelProfilePageState createState() => new _ResponsavelProfilePageState();
}
class _ResponsavelProfilePageState extends State<ResponsavelProfilePage> {
int _count = 1;
@override
Widget build(BuildContext context) {
List<Widget> _contatos = new List.generate(_count, (int i) => new ContactRow());
return new Scaffold(
appBar: new AppBar(
title: new Text(GlobalConstants.appName),
),
body: new LayoutBuilder(builder: (context, constraint) {
final _maxHeight = constraint.biggest.height / 3;
final _biggerFont = TextStyle(fontSize: _maxHeight / 6);
return new Center(
child: new Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
new TextFormField(
decoration: new InputDecoration(
labelText: 'Nome',
),
),
new Container(
padding: new EdgeInsets.all(20.0),
),
new TextFormField(
decoration: new InputDecoration(
labelText: 'Data de nascimento',
),
),
new Container(
padding: new EdgeInsets.all(20.0),
),
new Row(
children: _contatos,
),
new FlatButton(
onPressed: _addNewContactRow,
child: new Icon(Icons.add),
),
//new ContactRow()
],
),
);
})
);
}
void _addNewContactRow() {
setState(() {
_count = _count + 1;
});
}
}
class ContactRow extends StatefulWidget {
@override
State<StatefulWidget> createState() => new _ContactRow();
}
class _ContactRow extends State<ContactRow> {
@override
Widget build(BuildContext context) {
return new Container(
child:
new Column(
children: <Widget>[
new TextFormField(
decoration: new InputDecoration(
labelText: 'Contato',
),
),
new Text("Tipo Contato: "),
new DropdownButton(
value: _currentContactType,
items: _dropDownMenuItems,
onChanged: changedDropDownItem,
),
new Container(
padding: new EdgeInsets.all(20.0),
),
]
)
);
}
List _contactTypes =
["Phone (SMS)", "Phone (Whatsapp)", "Email"];
List<DropdownMenuItem<String>> _dropDownMenuItems;
String _currentContactType;
@override
void initState() {
_dropDownMenuItems = getDropDownMenuItems();
_currentContactType = null;
super.initState();
}
List<DropdownMenuItem<String>> getDropDownMenuItems() {
List<DropdownMenuItem<String>> items = new List();
for (String city in _contactTypes) {
items.add(new DropdownMenuItem(
value: city,
child: new Text(city)
));
}
return items;
}
void changedDropDownItem(String selectedCity) {
setState(() {
_currentContactType = selectedCity;
});
}
}
我想在用户单击平面按钮时添加另一个ContactRow,并将addNewContactRow()设置为onPressed。我已经找到了addNewContactRow()和List.generate部分的代码,但是我不能让它工作。
有人能帮帮忙吗?
3条答案
按热度按时间zbq4xfa01#
只需将Row替换为ListView。
也做了一些变化,在高度/宽度检查出来。
结果:验证码:
6ss1mwsb2#
这是一种方法
首先,让我们看看列的
children
属性是什么。List<Widget> children: const <Widget> []
这是一个
List
的Widgets。由于Flutter UI是在代码中构建的,我们可以传递一个我们之前构建的子数组。不需要每次都在[]
中声明它,当您希望在Column
或Row
中使用动态子元素时,这很方便在构建器中,返回 Package 列的
Center
小部件。由于builder是一个函数,我们可以在返回Widget之前做一些魔术。让我们首先将数组从Column本身提取到一个变量中:
这是你们目前掌握的专栏。查看您的问题,您现在要做的是为每个
_count
添加一个Contact行因此,我们进行简单的老式迭代,每次迭代都将一个
ContactRow
添加到List
中在我们构建了List之后,将它作为参数传递给孩子们。
这只是一个简单的例子。Remember All UI是用纯代码构建的,你可以将你从代码构建中获得的所有知识应用到它上。例如,我们可以提取方法来构建Column的子级,使其更漂亮
现在,我们将创建一个新的方法来返回List本身,而不是在builder方法中创建List
重要的是不要忘记,但您已经在代码中有了,就是更新
setState
中的_count
属性,以便使用new _count重新构建子节点8gsdolmq3#
更新了@Ajay为新Flutter 3.13.0和Dart 3.1.0提供的代码