【发布时间】:2021-06-02 01:39:29
【问题描述】:
我创建了一个基于数据库条目的自定义小部件的 ListView.builder。现在我正在尝试添加删除功能。当我单击该按钮时,该条目会相应地从数据库中删除。但是,尽管调用了 setState(),但 ListView 不会更新。我怀疑这可能是由于删除方法是异步的,我怎样才能让应用程序先删除条目然后刷新 ListView?
我的 ListView.builder 的代码是:
ListView.builder(
padding: const EdgeInsets.all(8.0),
itemExtent: 106.0,
itemCount: snapshot.data.length,
itemBuilder: (context, index) {
return CustomListItem(
name: transactionsReversed[index].name,
category: transactionsReversed[index].category,
sign: transactionsReversed[index].sign,
amount: transactionsReversed[index].amount,
id: transactionsReversed[index].id,
delete: (){
print('Running delete function on ${transactionsReversed[index].id}');
setState(() {
_remove(transactionsReversed[index].id);
});
}
);
}
),
自定义列表项如下所示:
class CustomListItem extends StatelessWidget {
const CustomListItem({
this.name, this.category, this.sign, this.amount, this.id, this.delete
});
final String name;
final String category;
final String sign;
final double amount;
final int id;
final Function delete;
@override
Widget build(BuildContext context) {
const double radius = 15.0;
return Padding(
padding: const EdgeInsets.symmetric(vertical: 5.0),
child: InkWell(
onTap: () {
Navigator.pushNamed(context, '/category_viewer', arguments: {
'category': category
});
},
child: Container(
color: Colors.transparent,
child: Container(
decoration: BoxDecoration(
color: Colors.black,
borderRadius: new BorderRadius.only(
topLeft: const Radius.circular(radius),
topRight: const Radius.circular(radius),
bottomLeft: const Radius.circular(radius),
bottomRight: const Radius.circular(radius),
),
),
child: Row(
mainAxisAlignment: MainAxisAlignment.start,
crossAxisAlignment: CrossAxisAlignment.center,
children: <Widget>[
Expanded(
flex: 1,
child: IconButton(
onPressed: delete,
icon: Icon(
Icons.delete_outlined,
color: Colors.red,
size: 40,
),
color: Colors.red
),
),
Expanded(
flex: 3,
child: Padding(
padding: const EdgeInsets.fromLTRB(5.0, 0.0, 0.0, 0.0),
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.start,
children: <Widget>[
Text(
name,
style: const TextStyle(
fontWeight: FontWeight.w500,
fontSize: 20.0,
color: Colors.white
),
),
const Padding(padding: EdgeInsets.symmetric(vertical: 2.0)),
Text(
category,
style: const TextStyle(
fontSize: 14.0,
color: Colors.white
),
),
],
),
),
),
Padding(
padding: const EdgeInsets.fromLTRB(0, 0, 50, 0),
child: Text(
'$sign${amount.toStringAsFixed(2)}€',
style: TextStyle(
fontSize: 25.0,
color: sign == '+' ? Colors.green : Colors.red
),
),
),
],
),
),
),
),
);
}
}
最后,remove方法很简单:
_remove(int id) async {
DatabaseHelper helper = DatabaseHelper.instance;
await helper.deleteTransaction(id);
}
【问题讨论】:
-
我不确定,但也许你可以初始化一个布尔值。然后,如果 bool 为真,则刷新列表视图。它以 false 开头,当您删除条目时,您可以将您的 bool 设置为 true,然后刷新是否有效?
标签: flutter listview dart setstate