我正在尝试从数据库中删除我的数据,如果成功,将继续导航到我的主页。
下面是我的代码:
StatelessWidget由deleteFromDatabase方法组成,该方法传递了一个Id
(String),一个context
:
Consumer<SettingsProvider>(
builder: (context, settingsProvider, child) {
final exerciseSettings = settingsProvider.findById(id);
if (exerciseSettings == null) {
return Center(
child: CircularProgressIndicator(),
);
}
return PreviewExerciseItem(
exerciseSettings: exerciseSettings,
id: id,
navigateToEdit: () =>
_navigateToEditPage(exerciseSettings, context),
deleteFromDatabase: () => _deleteFromDatabase(id, context),
navigateToCountDown: () =>
navigateToCountDownPage(exerciseSettings, context),
);
},
),
从StatelessWidget调用_deleteFromDatabase方法,并显示AlertDialog以确认删除:
void _deleteFromDatabase(String id, context) async {
await showDialog(
context: context,
builder: (context) => new AlertDialog(
title: new Text("Are you sure you want to delete?"),
actions: <Widget>[
new FlatButton(
onPressed: () => Navigator.of(context).pop(false),
child: new Text('No'),
),
new FlatButton(
onPressed: () async {
try {
Navigator.of(context).pop(true);
await Provider.of<SettingsProvider>(context, listen: false)
.deleteFromList(id);
Navigator
.pushNamedAndRemoveUntil(context,HomePage.routeName, (Route route) => route.isFirst);
} catch (e) {
print(e);
}
},
child: new Text('Yes'),
),
],
),
);
}
deleteFromList方法从My Provider类:
Future<void> deleteFromList(String id) async{
try{
final _itemIndex = _items.indexWhere((item) => item.id == id);
await _databaseHelper.deleteExercises(id);
_items.removeAt(_itemIndex);
notifyListeners();
}catch(e){
print(e);
}
}
来自提供程序类的findById:
CustomExercise findById(String id) {
return _items.firstWhere((prod) => prod.id == id);
}
注意:我可以成功地从数据库中删除我的数据,但是就在它导航到我的主页之前,一个错误在一瞬间以红屏的形式弹出:错误状态:无元素
下面是我的日志中的完整错误消息:
在构建Consumer(dirty,dependencies:[_InheritedProviderScope,_InheritedTheme,_LocalizationsScope-[GlobalKey#5ce12]]):错误状态:无元素
导致错误的相关小部件为:
Consumer<SettingsProvider>
当抛出异常时,这是堆栈:
4条答案
按热度按时间9cbw7uwe1#
当列表为空或者第一个元素为空时,会发生这种情况,因此您应该检查列表是否为空。
你肯定会收到这样的信息:
解决方案是:
我希望这对某人有帮助,谢谢!
2nc8po8w2#
正如前面在注解中提到的,检查空List的值可能会导致错误。一个解决方法是,如果
CustomExercise findById(String)
和deleteFromList(String)
上的List都为空,则使用一个检查器。即
r6l8ljro3#
我们使用了**Drift(formerly摩尔)**及其
watchSingle()
方法。如果没有找到匹配的数据库行,则将抛出此错误。这是很难跟踪,因为流发出的错误,它没有附加堆栈跟踪。
修复方法是使用
watch()
和limit(1)
,如果结果为空,则跳过处理。fnx2tebb4#
使用orElse回调返回CustomExercise()的示例。有了它,你就不会有错误了。