使用HydratedBloc遇LateInitializationError:__storage未初始化
解决HydratedBloc中的LateInitializationError问题
错误原因
你遇到的LateInitializationError: Field '__storage@30190796' has not been initialized.异常,是因为使用HydratedMixin时未正确触发状态恢复逻辑,导致Mixin尝试访问未完成初始化的存储实例。另外你的代码存在文件命名与类定义颠倒的问题(counter_cubit.dart定义CounterState,counter_state.dart定义CounterCubit),虽不直接引发错误,但会增加排查难度。
修复步骤
1. 改用HydratedCubit基类(推荐)
直接继承HydratedCubit而非手动混入HydratedMixin,它会自动处理状态的持久化与恢复逻辑,无需手动调用hydrate():
修正后的counter_cubit.dart:
import 'package:equatable/equatable.dart'; import 'package:hydrated_bloc/hydrated_bloc.dart'; part 'counter_state.dart'; class CounterCubit extends HydratedCubit<CounterState> { CounterCubit() : super(const CounterState(counterValue: 0)); void increment() => emit(CounterState(counterValue: state.counterValue + 1)); void decrement() => emit(CounterState(counterValue: state.counterValue - 1)); @override CounterState? fromJson(Map<String, dynamic> json) { return CounterState.fromMap(json); } @override Map<String, dynamic>? toJson(CounterState state) { return state.toMap(); } }
修正后的counter_state.dart:
part of 'counter_cubit.dart'; class CounterState extends Equatable { final int counterValue; const CounterState({required this.counterValue}); @override List<Object> get props => [counterValue]; factory CounterState.fromMap(Map<String, dynamic> json) => CounterState( counterValue: json['counterValue'] as int, ); Map<String, dynamic> toMap() { return {'counterValue': counterValue}; } }
2. 简化HydratedStorage初始化(可选)
HydratedStorage.build支持直接传入Directory对象,无需手动包装HydratedStorageDirectory,修改main.dart中的初始化代码:
void main() async { WidgetsFlutterBinding.ensureInitialized(); HydratedBloc.storage = await HydratedStorage.build( storageDirectory: await getApplicationDocumentsDirectory(), ); runApp(const MyApp()); }
3. 确认依赖版本
确保pubspec.yaml中依赖版本兼容:
dependencies: flutter: sdk: flutter flutter_bloc: ^8.1.3 hydrated_bloc: ^9.1.2 equatable: ^2.0.5 path_provider: ^2.1.1
验证修复
运行应用后,点击加减按钮,退出再重新打开,计数器数值会保持上次退出时的状态,且不会再触发初始化异常。
内容的提问来源于stack exchange,提问作者Alex
相关产品推荐
相关产品推荐

