flutter - 在出现错误时不应该关闭项目
问题描述
除非出现错误,否则下面的代码可以正常工作。即使出现“无网络”或“无法连接到数据库”之类的错误,当不应该删除该项目时,它也会从列表中删除。如果出现错误如何处理?
class DismissibleListItem extends StatelessWidget {
const DismissibleListItem({
this.key,
this.product,
this.onTap,
});
final Key key;
final Product product;
final VoidCallback onDismissed;
final VoidCallback onTap;
@override
Widget build(BuildContext context) {
return Dismissible(
background: Container(color: Colors.red),
key: key,
direction: DismissDirection.endToStart,
onDismissed: (direction) => onDismissed(),
child: ProductListItem(
product: product,
onTap: onTap,
),
);
}
}
解决方案
小Dismissible
部件为此提供了一个选项,confirmDismiss
. 它期望一个Future<bool>
. 你给它一个Future
返回true
or的方法false
。因此,根据您的网络操作是否失败,您可以进行Dismissible
重置:
class Issue65842845 extends StatefulWidget {
@override
_Issue65842845State createState() => _Issue65842845State();
}
class _Issue65842845State extends State<Issue65842845> {
List<String> items = [
'item 1',
'item 2',
];
@override
Widget build(BuildContext context) {
return ListView.builder(
itemCount: items.length,
itemBuilder: (context, index){
return Dismissible(
background: Container(color: Colors.red),
key: Key(items[index].hashCode.toString()),
direction: DismissDirection.startToEnd,
confirmDismiss: (direction) => confirmDismiss(items[index]),
child: Container(
padding: EdgeInsets.all(6),
child: Text(items[index]),
height: 30,
alignment: Alignment.centerLeft,
),
);
},
);
}
Future<bool> confirmDismiss(String text) async {
if(text == 'item 1'){
// Operation was successful and item was removed from remote server
// Dismissible is removed
return true;
} else {
// Operation failed and Dismissible is reset
return false;
}
}
}
推荐阅读
- angular - 无法从代码 Angular4 设置 Switchery 的 SetPosition 的值
- google-apps-script - SORT 脚本适用于所有者,但不适用于编辑
- n-gram - 有什么方法可以将 2 个 ngram 语言模型组合成 1 个?
- opencv - VS2013 + Win7 中缺少 MSVCP140.dll
- mysql - MYSQL 窗口函数
- sql - PostgreSQL - 字段中只有不同的值
- python - 在带有块的内部使用for循环时如何格式化Python
- sql - 使用按子查询分组的计算字段
- r - 缺少值组合的完整数据框
- javascript - 在javascript中解析日期