Flutter不良状态无元素

qzlgjiam  于 2023-06-30  发布在  Flutter
关注(0)|答案(4)|浏览(135)

我正在尝试从数据库中删除我的数据,如果成功,将继续导航到我的主页。
下面是我的代码:
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>

当抛出异常时,这是堆栈:

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>(package: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)

9cbw7uwe

9cbw7uwe1#

当列表为空或者第一个元素为空时,会发生这种情况,因此您应该检查列表是否为空。

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'!);
  }

我希望这对某人有帮助,谢谢!

2nc8po8w

2nc8po8w2#

正如前面在注解中提到的,检查空List的值可能会导致错误。一个解决方法是,如果CustomExercise findById(String)deleteFromList(String)上的List都为空,则使用一个检查器。

if(_items != null && _items.length > 0)
r6l8ljro

r6l8ljro3#

我们使用了**Drift(formerly摩尔)**及其watchSingle()方法。如果没有找到匹配的数据库行,则将抛出此错误。
这是很难跟踪,因为流发出的错误,它没有附加堆栈跟踪。
修复方法是使用watch()limit(1),如果结果为空,则跳过处理。

fnx2tebb

fnx2tebb4#

使用orElse回调返回CustomExercise()的示例。有了它,你就不会有错误了。

CustomExercise findById(String id) {
  return _items.firstWhere((prod) => prod.id == id,
    orElse: () => CustomExercise());
}

相关问题