здесь, когда вы проверяете, является ли последний тег пустым или нет, он выдает ошибку, потому что индекс начинается с 0, поэтому последний элемент будет считать-1.
Более того, вы создаете список каждый раз, поэтому текст будет удален из текстового поля. чтобы избежать этого, вы можете создавать список вне метода сборки и каждый раз добавлять элемент.
следующий код поможет вам лучше понять.
int count = 0;
List<TagColumn> ok = List(); // list created out side
@override
Widget build(BuildContext context) {
// List<TagColumn> ok = List.generate(count, (int i) => new TagColumn()); // commented list
return Scaffold(
backgroundColor: Colors.black,
body: new LayoutBuilder(builder: (context, constraint) {
return new Stack(
children: <Widget>[
SingleChildScrollView(
child: SafeArea(
child: new Wrap(
direction: Axis.horizontal,
children: ok,
)),
),
new Positioned(
child: new Align(
alignment: FractionalOffset.bottomRight,
child: Container(
margin: EdgeInsets.only(bottom: 50.0, right: 40.0),
child: RawMaterialButton(
onPressed: () {
setState(() {
if (count != 0 &&
ok[count - 1].text.text.isEmpty) { // cout check change
} else {
ok.add(TagColumn()); // add new item on click
count++;
}
});
},
shape: CircleBorder(),
child: Icon(
Icons.add_circle,
size: 100.0,
color: Color(0xffd3d3d3),
),
))))
],
);
}),
);
}