You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 17:04:51