未处理的异常:错误状态:尝试从 Hive 获取值时没有元素

Posted

技术标签:

【中文标题】未处理的异常:错误状态:尝试从 Hive 获取值时没有元素【英文标题】:Unhandled Exception: Bad state: No element While trying to fetch values from Hive 【发布时间】:2021-11-17 15:02:10 【问题描述】:

我正在尝试从Hive 获取一些值以检查数据是否可用或者我需要再次获取它。 我正在使用 hive 来保存数据。 我在 main.dart 中使用 Layout builder 和导航器小部件来设置命名路由。

我的初始路线是project_list.dart。这是 project_list.dart 中的代码:

class ProjectsList extends StatefulWidget 
  const ProjectsList(Key? key) : super(key: key);
  static const String id = 'ProjectsList';

  @override
  State<ProjectsList> createState() => _ProjectsListState();


class _ProjectsListState extends State<ProjectsList> 

  late Box<LoggedInUser> userBox;
  late Box<List<ProjectModal>> projectBox;

  List<ProjectModal> projectList = [];
  List<ProjectModal> projectListFiltered = [];

  GlobalKey<RefreshIndicatorState> _indicatorKey = GlobalKey<RefreshIndicatorState>();

  final GlobalKey<ScaffoldState> _scaffoldKey = GlobalKey<ScaffoldState>();

  bool isLoading = false;
  bool isSearching = false;

  @override
  void initState() 
    // TODO: implement initState
    super.initState();
    getHiveBox();
  

  Future<void> getHiveBox() async 
    userBox = Hive.box(LoggedInUser.boxID);
    projectBox = Hive.box<List<ProjectModal>>(ProjectModal.boxID);


    // HERE IS THE PROBLEM
    // It crashes on projectBox.values

    print(projectBox.values.first.length);

    if (projectBox.values.first.isEmpty) 
      print('EMPTY PROJECT LIST');
      await getProjectsList();
    

  

  Future<void> getProjectsList() async 
    // _indicatorKey.currentState?.show();
    SchedulerBinding.instance?.addPostFrameCallback((_)  
_indicatorKey.currentState?.show();  );
    WebServices webServices = WebServices(URLs.projectList());
    var data = await webServices.get(isV1: false);
    var projectListData = ProjectModal.getProjectsList(data);
    setState(() 
      isLoading = false;
      projectList = projectListData;
    );
  

它在projectBox.values 上崩溃,当我删除该代码时它会修复。我需要离线保存数据,我读到 Hive 是在 Flutter 中离线存储数据的最快方式。此外,我是飞镖新手,所以我不知道 Hive 是否是这个原因。它确实给了我很多错误。 这是控制台中显示的错误堆栈

[VERBOSE-2:ui_dart_state.cc(209)] Unhandled Exception: Bad state: No element
#0      Iterable.first (dart:core/iterable.dart:490:7)
#1      MappedIterable.first (dart:_internal/iterable.dart:370:31)
#2      _ProjectsListState.getHiveBox         
(package:thareja_time_tracker/views/projects_list.dart:48:29)
#3      _ProjectsListState.initState.<anonymous closure>     
(package:thareja_time_tracker/views/projects_list.dart:40:7)
#4      new Future.delayed.<anonymous closure> (dart:async/future.dart:315:39)
#5      _rootRun (dart:async/zone.dart:1420:47)
#6      _CustomZone.run (dart:async/zone.dart:1328:19)
#7      _CustomZone.runGuarded (dart:async/zone.dart:1236:7)
#8      _CustomZone.bindCallbackGuarded.<anonymous closure>     
(dart:async/zone.dart:1276:23)
#9      _rootRun (dart:async/zone.dart:1428:13)
#10     _CustomZone.run (dart:async/zone.dart:1328:19)
#11     _CustomZone.bindCallback.<anonymous closure> (dart:async/zone.dart:1260:23)
#12     Timer._createTimer.<anonymous closure> (dart:async-patch/timer_patch.<…>

编辑:我看到当试图访问一个空的迭代时,弹出了这个错误,所以我把它改成了这个:

Future<void> getHiveBox() async 
    userBox = Hive.box<LoggedInUser>(LoggedInUser.boxID);
    projectBox = Hive.box<List<ProjectModal>>(ProjectModal.boxID);

    print(projectBox.values.length);

    List<ProjectModal> first = projectBox.values.isEmpty ? [] : projectBox.values.first;

    print(first.length);

    if (first.isEmpty) 
        print('EMPTY PROJECT LIST');
        await getProjectsList();
     else 
        print('PROJECT LIST DETECTED\n$first.length');
        setState(() 
          projectList = first;
        );
    
  

但现在,错误已更改为 未处理的异常:类型“列表”不是类型转换中“列表”类型的子类型

特别是在projectBox.values.first.first 部分 我可以打印projectBox.values,它总是1(一个列表),但甚至不能打印projectBox.values.first

【问题讨论】:

【参考方案1】:

你不能在空的Iterable上调用first

List<ProjectModal> first = projectBox.values.isEmpty ? [] : projectBox.values.first.cast<ProjectModal>();
print(first.length);
if(first.isEmpty)
    print('EMPTY PROJECT LIST');
    await getProjectsList();

【讨论】:

嗨,我也试过这个,但我得到另一个异常,说 Unhandled Exception: type 'List' is not a subtype of type 'List' in typecast and its on projectBox .values.first,特别是 .first 我更新了我的答案,但这个异常表明您的HiveBox 的类型不正确。

以上是关于未处理的异常:错误状态:尝试从 Hive 获取值时没有元素的主要内容,如果未能解决你的问题,请参考以下文章

如何获取基于 HIVE-SQOOP 的批处理作业的异常、错误和日志?

Flutter firebase 查询快照错误:“未处理的异常:错误状态:无元素”

当我尝试使用 Laravel 中的“别名”从数据库中获取值时如何修复“未定义的偏移量:0”

Flutter:未处理的异常:错误状态:DocumentSnapshotPlatform中不存在字段

当我尝试使用地理编码器获取地址时,给出“未处理的异常:PlatformException(失败,失败,null)”的运行时错误

未处理的异常:错误状态:平台不允许使用不安全的 HTTP - usesClearTextTraffic 不起作用