flutter - Flutter Bad State 无元素
问题描述
我正在尝试从数据库中删除我的数据,如果成功则继续导航到我的主页。
以下是我的代码:
StatelessWidget 由 deleteFromDatabase 方法组成,该方法传递了一个Id
(字符串),一个 a 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]]) 引发了以下 StateError:错误状态:无元素
相关的导致错误的小部件是:
Consumer<SettingsProvider>
抛出异常时,这是堆栈:
#0 ListMixin.firstWhere (dart:collection/list.dart:150:5)
#1 SettingsProvider.findById (package:workoutapp/providers/settings_provider.dart:12:19)
#2 PreviewExercisePage.build。<anonymous closure>
(包:workoutapp/pages/preview_exercise_page.dart:68:55)
#3 Consumer.buildWithChild (package:provider/src/consumer.dart:175:19)
#4 SingleChildStatelessWidget.build (package:nested/nested.dart:260:41)
解决方案
当列表为空或第一个元素为空时会发生这种情况,因此您应该检查列表是否为空。
List list = [];
print(list[0])
确定您会收到这样的消息:
Unhandled exception:
Bad state: No element
#0 List.first (dart:core-patch/growable_array.dart:332:5)
#1 main (file:///C:/Users/onbody/AndroidStudioProjects/nmae/bin/name.dart:9:14)
#2 _delayEntrypointInvocation.<anonymous closure> (dart:isolate-patch/isolate_patch.dart:281:32)
#3 _RawReceivePortImpl._handleMessage (dart:isolate-patch/isolate_patch.dart:184:12)
解决方案是:
List list = [];
if (list.isNotEmpty) {
print(list[0]);
} else {
print('the list is empty'!);
}
我希望这对某人有帮助谢谢!
推荐阅读
- javascript - 带有输入文本的单选按钮
- javascript - XMLHttpRequest.send(data) 不向 Django 视图函数传递数据
- linux - Linux MS Teams 预览版 + XMonad:可能会有通知浮动吗?
- reactjs - 选择并按住并拖动形状应水平或垂直滚动
- python - python:如何添加一个搜索路径
- python - 如何使用 Django 中的列表创建正确的 get 查询集以获取值
- javascript - 如何使用 For 循环动态更改 Vue Js 中的变量?
- discord - 分片状态命令 - Discord.JS V12
- python-3.x - 如何使用 pip 将 python 包下载到具有公共访问权限的 Google Cloud Storage 存储桶中并从那里安装
- python - 根据此数据框中其他列中的特定值更改熊猫数据框中的一列中的值(使用应用),并带有掩码