当我想在Flutter Bloc中调用Hive功能时,我有错误

发布于 2025-02-07 01:28:32 字数 3961 浏览 4 评论 0原文

当我想在Flutter Bloc中调用Hive功能时,我会出错。我有盒子作为flutter Bloc的服务,但我会发现这个错误

[ERROR:flutter/lib/ui/ui_dart_state.cc(198)] Unhandled Exception: LateInitializationError: Field '_course@823127803' has not been initialized.
#0      CourseService._course (package:personal_ui/services/courses_service.dart)
#1      CourseService.getCourses package:personal_ui/services/courses_service.dart:13
#2      new CoursesBloc.<anonymous closure>

courses.dart

@HiveType(typeId: 1)
class Course extends HiveObject {
  @HiveField(0)
  final String courseName;
  @HiveField(1)
  final String color;
  @HiveField(2)
  final List<Map<dynamic, dynamic>> shedule;

  Course(this.courseName, this.shedule, this.color);
}

courses_service.dart

class CourseService {
  late Box<Course> _course;

  Future<void> init() async {
    Hive.registerAdapter(CourseAdapter());
    _course = await Hive.openBox<Course>('course');
  }

  List<Course> getCourses() {
    return _course.values.toList();
  }

  void addCourse(Course course) {
    _course.add(course);
  }

  Future<void> removeCourse(Course course) async {
    final courseToRemove = _course.values
        .firstWhere((element) => element.courseName == course.courseName);
    await courseToRemove.delete();
  }
}

courses_bloc。 dart

class CoursesBloc extends Bloc<CoursesEvent, CoursesState> {
  final CourseService _courseService;
  CoursesBloc(this._courseService) : super(CoursesInitial()) {
    on<LoadCoursesEvent>(((event, emit) {
      final courses = _courseService.getCourses();
      emit(CoursesLoadedState(courses));
    }));
  }

courses_state.dart

abstract class CoursesState extends Equatable {
  const CoursesState();
}

class CoursesInitial extends CoursesState {
  @override
  List<Object> get props => [];
}

class CoursesLoadedState extends CoursesState {
  final List<Course> courses;

  CoursesLoadedState(this.courses);
  @override
  // TODO: implement props
  List<Object?> get props => throw UnimplementedError();
}

courses_event.dart

abstract class CoursesState extends Equatable {
  const CoursesState();
}

class CoursesInitial extends CoursesState {
  @override
  List<Object> get props => [];
}

class CoursesLoadedState extends CoursesState {
  final List<Course> courses;

  CoursesLoadedState(this.courses);
  @override
  // TODO: implement props
  List<Object?> get props => throw UnimplementedError();
}

实施


BlocProvider(
                create: (context) =>
                    CoursesBloc(RepositoryProvider.of<CourseService>(context))
                      ..add(LoadCoursesEvent()),
                child: BlocBuilder<CoursesBloc, CoursesState>(
                  builder: (context, state) {
                    if (state is CoursesInitial) {
                      return const Center(
                        child: CircularProgressIndicator(),
                      );
                    }
                    if (state is CoursesLoadedState) {
                      return ListView(
                        shrinkWrap: true,
                        children: state.courses
                            .map((e) => CourseItem(
                                color: Colors.amber, courseName: e.courseName))
                            .toList(),
                      );
                    }
                    return Container();
                  },
                ),

我需要在启动应用程序并根据ListView中的内容显示该功能的函数获取课程,据说它不是初始化的,但我找不到错误。

I have an error when I want to call a Hive function in Flutter Bloc. I have my box as a service in flutter bloc but I get this error

[ERROR:flutter/lib/ui/ui_dart_state.cc(198)] Unhandled Exception: LateInitializationError: Field '_course@823127803' has not been initialized.
#0      CourseService._course (package:personal_ui/services/courses_service.dart)
#1      CourseService.getCourses package:personal_ui/services/courses_service.dart:13
#2      new CoursesBloc.<anonymous closure>

courses.dart

@HiveType(typeId: 1)
class Course extends HiveObject {
  @HiveField(0)
  final String courseName;
  @HiveField(1)
  final String color;
  @HiveField(2)
  final List<Map<dynamic, dynamic>> shedule;

  Course(this.courseName, this.shedule, this.color);
}

courses_service.dart

class CourseService {
  late Box<Course> _course;

  Future<void> init() async {
    Hive.registerAdapter(CourseAdapter());
    _course = await Hive.openBox<Course>('course');
  }

  List<Course> getCourses() {
    return _course.values.toList();
  }

  void addCourse(Course course) {
    _course.add(course);
  }

  Future<void> removeCourse(Course course) async {
    final courseToRemove = _course.values
        .firstWhere((element) => element.courseName == course.courseName);
    await courseToRemove.delete();
  }
}

courses_bloc.dart

class CoursesBloc extends Bloc<CoursesEvent, CoursesState> {
  final CourseService _courseService;
  CoursesBloc(this._courseService) : super(CoursesInitial()) {
    on<LoadCoursesEvent>(((event, emit) {
      final courses = _courseService.getCourses();
      emit(CoursesLoadedState(courses));
    }));
  }

courses_state.dart

abstract class CoursesState extends Equatable {
  const CoursesState();
}

class CoursesInitial extends CoursesState {
  @override
  List<Object> get props => [];
}

class CoursesLoadedState extends CoursesState {
  final List<Course> courses;

  CoursesLoadedState(this.courses);
  @override
  // TODO: implement props
  List<Object?> get props => throw UnimplementedError();
}

courses_event.dart

abstract class CoursesState extends Equatable {
  const CoursesState();
}

class CoursesInitial extends CoursesState {
  @override
  List<Object> get props => [];
}

class CoursesLoadedState extends CoursesState {
  final List<Course> courses;

  CoursesLoadedState(this.courses);
  @override
  // TODO: implement props
  List<Object?> get props => throw UnimplementedError();
}

implementation


BlocProvider(
                create: (context) =>
                    CoursesBloc(RepositoryProvider.of<CourseService>(context))
                      ..add(LoadCoursesEvent()),
                child: BlocBuilder<CoursesBloc, CoursesState>(
                  builder: (context, state) {
                    if (state is CoursesInitial) {
                      return const Center(
                        child: CircularProgressIndicator(),
                      );
                    }
                    if (state is CoursesLoadedState) {
                      return ListView(
                        shrinkWrap: true,
                        children: state.courses
                            .map((e) => CourseItem(
                                color: Colors.amber, courseName: e.courseName))
                            .toList(),
                      );
                    }
                    return Container();
                  },
                ),

I need to call the function get courses when I start the application and show it according to the content in the listview, supposedly it is not initialized but I can't find the error.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文