Flutter 颤振不良状态无元件

Flutter 颤振不良状态无元件,flutter,navigation,provider,Flutter,Navigation,Provider,我正在尝试从数据库中删除数据,如果成功,则继续导航到我的主页 以下是我的代码: 无状态小部件,由deleteFromDatabase方法组成,该方法传递一个Id(字符串),一个上下文: Consumer<SettingsProvider>( builder: (context, settingsProvider, child) { final exerciseSettings = settingsProvider.findById(id);

我正在尝试从数据库中删除数据,如果成功,则继续导航到我的主页

以下是我的代码:

无状态小部件,由deleteFromDatabase方法组成,该方法传递一个
Id
(字符串),一个
上下文

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),
        );
      },
    ),
注意:我能够成功地从数据库中删除我的数据,但是就在它导航到我的主页之前,一个错误以红色屏幕的形式在瞬间弹出:错误状态:无元素

以下是我的日志中的完整错误消息:

生成使用者时引发以下状态错误(脏,依赖项:[\u InheritedProviderScope,\u InheritedTheme,\u LocalizationsScope-[GlobalKey#5ce12]]): 错误状态:无元素

导致错误的相关小部件是:

Consumer<SettingsProvider>
消费者
引发异常时,这是堆栈:

#0 ListMixin.firstWhere(dart:collection/list.dart:150:5)

#1 SettingsProvider.findById(包:workoutapp/providers/settings\u provider.dart:12:19)

#2预览XercisePage.build.
(软件包:workoutapp/pages/preview\u exercise\u page.dart:68:55)

#3 Consumer.buildWithChild(包:provider/src/Consumer.dart:175:19)


#4 SingleChildStatelessWidget.build(包:nested/nested.dart:260:41)

如前所述,检查空列表的值可能会导致错误。解决方法是,如果列表在
CustomExercise findById(String)
deleteFromList(String)
上均为空,则使用检查程序

i、 e

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

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

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)

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

错误状态:当您调用空列表的方法并且需要通过其元素检查值时(在本例中,在某些列表中调用firstWhere时设置provider.findById(id))大多数情况下都不会出现任何元素,您可以发布该方法findById的代码吗?您好,是的,您是对的。显然,因为我使用的是消费者,所以它一直在监听更改,因此在我删除数据后,它会收到一个空值,据推测它应该已经停止监听了。因此,我必须使用Provider.of(context,listen:false)而不是Consumer来解决我的问题,以确保它在加载屏幕时只侦听一次。另外,对于我的情况,在导航到我的主页之前,错误只在屏幕上出现一瞬间,数据确实成功地从数据库中删除了。所以在我的例子中,问题不在于findById函数。但是谢谢你,就像以前我忽略了这个函数一样,我一直认为我的问题在于删除函数。。。请帮忙。。。
CustomExercise findById(String id) {
  return _items.firstWhere((prod) => prod.id == id);
}
Consumer<SettingsProvider>
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)