Hydrated Bloc: Persist and Restore Your Bloc State/Data
How to persist and restore data of your Bloc using Hydrated Bloc?

Search for a command to run...
How to persist and restore data of your Bloc using Hydrated Bloc?

No comments yet. Be the first to comment.
Lessons from Code, Content, and Consistency

Reliability basics: Outbox pattern + why it matters

Introducing Kafka/Redpanda + move to event-driven workflow

Connect Orders ↔ Inventory (first working service-to-service flow)

Inventory service + gRPC + proto contracts



hydrated bloc package in our project.hydrated bloc to pubspec.yaml under the dependencies: section.dependencies:
hydrated_bloc: ^8.0.0
path_provider package is also required to obtain the application directory path.dependencies:
path_provider: ^2.0.8
main function:Future<void> main() async {
WidgetsFlutterBinding.ensureInitialized();
final storage = await HydratedStorage.build(
storageDirectory: await getApplicationDocumentsDirectory(),
);
HydratedBlocOverrides.runZoned(
() => runApp(RepositoryProvider(
create: (context) => TodoRepository(),
child: const MyApp(),
)),
storage: storage,
);
}
runApp, we must first call WidgetsFlutterBinding.ensureInitialized();.HydratedStorage.build() method is then used to link our application to the storage. If the storageDirectory parameter is not specified, the data will be stored temporarily in the device by default. So to avoid that we are going to acquire the application directory path using path_provider package.class TodoBloc extends HydratedBloc<TodoEvent, TodoState> {}
class TodoBloc extends Bloc<TodoEvent, TodoState> with HydratedMixin {}
class TodoBloc extends HydratedBloc<TodoEvent, TodoState> {
//....
@override
TodoState? fromJson(Map<String, dynamic> json) {}
@override
Map<String, dynamic>? toJson(TodoState state) {}
@override
Map<String, dynamic>? toJson(TodoState state) {
if (state is TodoLoaded) {
return state.toJson();
} else {
return null;
}
}
class TodoLoaded extends TodoState {
//....
Map<String, dynamic> toJson() {
return {'todo': listOfTodo};
}
}
Now, after the data has been saved. We must additionally retrieve that data whenever the programme requires it. To accomplish so, we'll need to use the fromJson data. From the JSON format, this just returns the data in the form of Todo model.
@override
TodoState? fromJson(Map<String, dynamic> json) {
try {
final listOfTodo = (json['todo'] as List)
.map((e) => Todo.fromJson(e as Map<String, dynamic>))
.toList();
todoRepository.todoList = listOfTodo; //<-- This is IMPORTANT. You must assign the todoList defined in the TodoRepository to the locally stored `listOfTodo` to keep it up to date.
return TodoLoaded(listOfTodo);
} catch (e) {
return null;
}
}

