使用 FutureBuilder 和 Provider 在 Flutter 中出现错误状态没有元素

Posted

技术标签:

【中文标题】使用 FutureBuilder 和 Provider 在 Flutter 中出现错误状态没有元素【英文标题】:Bad state no element in Flutter Using FutureBuilder and Provider 【发布时间】:2021-01-17 23:10:18 【问题描述】:

使用Provider和FutureBuilder,我刚刚从数据库中删除了数据,它同时被删除了,它显示一个红色的屏幕,状态不好,没有元素。添加数据没有问题,不显示这个问题。 代码如下

堆栈跟踪

ter (12519): ══╡ EXCEPTION CAUGHT BY WIDGETS LIBRARY ╞═══════════════════════════════════════════════════════════
I/flutter (12519): The following StateError was thrown building ViewNoteScreen(dirty, dependencies:
I/flutter (12519): [_ModalScopeStatus], state: _ViewNoteScreenState#f589b):
I/flutter (12519): Bad state: No element
I/flutter (12519): 
I/flutter (12519): The relevant error-causing widget was:
I/flutter (12519):   ViewNoteScreen file:///C:/Users/Admin/Desktop/daily%2010/provider_note/lib/main.dart:21:46
I/flutter (12519):
I/flutter (12519): When the exception was thrown, this was the stack:
I/flutter (12519): #0      ListMixin.firstWhere (dart:collection/list.dart:148:5)
I/flutter (12519): #1      Providers.findById (package:provider_note/helper/provider.dart:14:19)
I/flutter (12519): #2      _ViewNoteScreenState.build (package:provider_note/screens/view_note.dart:21:35)
I/flutter (12519): #3      StatefulElement.build (package:flutter/src/widgets/framework.dart:4663:28)
I/flutter (12519): #4      ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4546:15)
I/flutter (12519): #5      StatefulElement.performRebuild (package:flutter/src/widgets/framework.dart:4719:11)
I/flutter (12519): #6      Element.rebuild (package:flutter/src/widgets/framework.dart:4262:5)
I/flutter (12519): #7      BuildOwner.buildScope (package:flutter/src/widgets/framework.dart:2667:33)
I/flutter (12519): #8      WidgetsBinding.drawFrame (package:flutter/src/widgets/binding.dart:866:20)
I/flutter (12519): #9      RendererBinding._handlePersistentFrameCallback (package:flutter/src/rendering/binding.dart:286:5)
I/flutter (12519): #10     SchedulerBinding._invokeFrameCallback (package:flutter/src/scheduler/binding.dart:1117:15)
I/flutter (12519): #11     SchedulerBinding.handleDrawFrame (package:flutter/src/scheduler/binding.dart:1056:9)
I/flutter (12519): #12     SchedulerBinding._handleDrawFrame (package:flutter/src/scheduler/binding.dart:972:5)
I/flutter (12519): #16     _invoke (dart:ui/hooks.dart:253:10)
I/flutter (12519): #17     _drawFrame (dart:ui/hooks.dart:211:3)
I/flutter (12519): (elided 3 frames from dart:async)
I/flutter (12519):
I/flutter (12519): ══════════════════════════════════════════════

【问题讨论】:

不应该是_items.remove(position);_items.removeAt(position); 吗? 不工作.. 我已经检查过了。实际上,它删除了数据,但显示红色屏幕,状态不佳,没有元素。 请告诉我_items变量的类型。 我在您的代码中看到一堆_items.firstWhere 语句。你确定这些不会导致问题吗?如果可能,请同时发布堆栈跟踪。 导致问题的行是final selectedNote = provider.findById(id);_ViewNoteScreenState。在堆栈跟踪中明确说明,您正在使用firstWhere 查找具有指定id 的注释,但它不存在。你应该做的是使用indexWhere 找到笔记的索引,如果它> = 0,那么笔记存在。 【参考方案1】:

BadStateException 发生在列表不包含该项目并且仍然有人搜索该项目时

示例:

如果 orElse 未在代码中定义并且错误的项目得到搜索,而列表中不存在则显示 BadStateException

 void main() 
      List<String> list = ['red', 'yellow', 'pink', 'blue'];
      var newList = list.firstWhere((element) => element.contains('green'));
      print(newList);
    

输出:

Uncaught Error: Bad state: No element

解决方法:添加orElse

 void main() 
      List<String> list = ['red', 'yellow', 'pink', 'blue'];
      var newList = list.firstWhere((element) => element.contains(''), 
          orElse: () => 'No matching color found');
      print(newList);
    

输出:

No matching color found

【讨论】:

@c49:查看已编辑的答案,如果项目在列表中不可用,那么您需要通过添加 orElse 来处理它 是的..找到它..但问题是它在删除后由于消费者或提供者而调用。如何避免调用它? 要么添加listen:false,但我认为应该调用,为了处理这个你必须从方法返回null,并在小部件内部处理这个null,例如:如果它为nulll,则不显示小部件 就是这个问题,findbyid不能返回null 为什么?你不能返回 null【参考方案2】:

我认为对您来说最简单的方法是将您的主页更改为有状态的小部件并更改这部分代码。

Navigator.pushNamed(
 context, ViewNoteScreen.routeName,
     arguments: notes.items[i].id).whenComplete(() 
      setState(() );
    );

【讨论】:

以上是关于使用 FutureBuilder 和 Provider 在 Flutter 中出现错误状态没有元素的主要内容,如果未能解决你的问题,请参考以下文章

INSTALL_FAILED_CONFLICTING_PROVIDER

选择值时出现颤振下拉按钮错误[使用来自 api 和 FutureBuilder 的数据]

Dismissible 和 FutureBuilder 不能一起工作

Flutter 使用 FutureBuilder 检索列表中的数据

使用带有本地 JSON 作为未来的 FutureBuilder 时出错

Flutter FutureBuilder 返回空数据