有这样的问题:我在应用程序ModalBottomSheet
中有ListView.builder
。简而言之,ListView的每一行都有两个输入字段和删除按钮。但无论按下哪一行的删除按钮,最后一行总是被删除。下面是我的代码:
List<Price> price = PriceUtils.getPrice();
// *My code there*
child: ListView.builder(
primary: false,
itemCount: price.length,
itemBuilder: ((context, index) {
return Column(
children: [
SizedBox(
height: 50,
child: Row(
mainAxisAlignment: MainAxisAlignment.start,
children: [
SizedBox(
height: 45,
width: 60,
child: TextFormField(
initialValue: (price[index].priceID !=-1)
? price[index].priceID.toString()
: null,
textInputAction: TextInputAction.next,
decoration: InputDecoration(
enabledBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(10),
borderSide: const BorderSide(
color: Color.fromARGB(204,199,199,199))),
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(10))))),
const SizedBox( width: 15),
SizedBox(
height: 45,
width: 100,
child: TextFormField(
initialValue: (price[index].priceID !=-1)
? price[index].priceCount.toString()
: null,
textInputAction: TextInputAction.done,
decoration: InputDecoration(
enabledBorder: OutlineInputBorder(
borderRadius: BorderRadius.circular(10),
borderSide: const BorderSide(
color: Color.fromARGB(204, 199, 199,199))),
border: OutlineInputBorder(
borderRadius: BorderRadius.circular(10))))),
SizedBox(
width: MediaQuery.of(context).size.width * 0.35 ),
IconButton(
icon: const Icon(Icons.cancel_outlined),
color: Colors.redAccent,
onPressed: () {
setState(() {
price.removeAt(index);});},)
更准确地说,最后一个元素仅在视觉上被删除,price
列表本身中的所有内容都被正确删除,也就是说,如果关闭ModalBottomSheet
并再次打开它,列表将正确显示。但是,正如你所理解的,不断地打开和关闭小部件来更新数据是一种过于依赖和不方便的解决方案。
Q1:因为你用了ListView。因此,它将列出列表中的所有项目,并且索引将增加,直到呈现列表中的所有项目。这就是为什么索引总是最后一个。
如果你想删除你所触碰的项目。你可以用"GestureDetector小部件"包裹,当你触摸索引的值会改变。
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text(widget.title),
),
body: ListView.builder(
itemCount: items.length,
itemBuilder: (context, index){
// return ListTile(
// title: Text('Date: ${myList[index]}'),
// // subtitle: Text('Subtitle: ${items[index].SubTitle} '),
// );
return GestureDetector(
onTap: (){
Navigator.pushNamed(
context,
items[index].Id,
);
},
child: ListTile(
title: Text('Date: ${items[index].Date}'),
subtitle: Text('Subtitle: ${items[index].SubTitle} '),
),
);
},
),// This trailing comma makes auto-formatting nicer for build methods.
);
}
第二季:当您重新呈现页面时,listprice将被重置,并且它从priceutil . getprice ();"中获取值,因此delete按钮只从"price"中删除该项目。not from " priceutil . getprice ()">