Problem polega na tym, że bloc mi działa, ale hydratedBloc już nie bardzo. Po restarcie apki wszystkie dane znikają.

bloc

class ShoppingListBloc
    extends HydratedBloc<ShoppingListEvent, ShoppingListState> {
  ShoppingListBloc() : super(ShoppingListInitial()) {
    on<AddShoppingListEvent>(_addShoppingList);
  }
  void _addShoppingList(
      AddShoppingListEvent event, Emitter<ShoppingListState> emit) async {
    emit(
      ShoppingListState(
        shoppingLists: List.from(state.shoppingLists)..add(event.shoppingList),
      ),
    );
  }

  @override
  ShoppingListState? fromJson(Map<String, dynamic> json) {
    return ShoppingListState.fromMap(json);
  }

  @override
  Map<String, dynamic>? toJson(ShoppingListState state) {
    return state.toMap();
  }
}

state

class ShoppingListState extends Equatable {
  final List<ShoppingList> shoppingLists;
  const ShoppingListState({
    this.shoppingLists = const <ShoppingList>[],
  });

  @override
  List<Object> get props => [shoppingLists];

  Map<String, dynamic> toMap() {
    return {
      'shoppingLists': shoppingLists.map((e) => e.toMap()).toList(),
    };
  }

  factory ShoppingListState.fromMap(Map<String, dynamic> map) {
    return ShoppingListState(
      shoppingLists: List<ShoppingList>.from(
        map['shoppingLists']?.map((x) => ShoppingList.fromMap(x)) ?? [],
      ),
    );
  }
}

final class ShoppingListInitial extends ShoppingListState {}

event

abstract class ShoppingListEvent extends Equatable {
  const ShoppingListEvent();

  @override
  List<Object> get props => [];
}

class AddShoppingListEvent extends ShoppingListEvent {
  final ShoppingList shoppingList;

  const AddShoppingListEvent({required this.shoppingList});

  @override
  List<Object> get props => [shoppingList];
}

main.dart

void main() async {
  WidgetsFlutterBinding.ensureInitialized();

  HydratedBloc.storage = await HydratedStorage.build(
      storageDirectory: await getApplicationDocumentsDirectory());
  await Firebase.initializeApp(
    options: DefaultFirebaseOptions.currentPlatform,
  );
  runApp(
    MyApp(
      appRouter: AppRouter(),
    ),
  );
}

class MyApp extends StatelessWidget {
  const MyApp({Key? key, required this.appRouter}) : super(key: key);
  final AppRouter appRouter;

  // This widget is the root of your application.
  @override
  Widget build(BuildContext context) {
    return MultiBlocProvider(
      providers: [
        BlocProvider(create: (context) => ShoppingListBloc()),
        BlocProvider(create: (context) => AppStateBloc()),
      ],
      child: MaterialApp(
        theme: ThemeData.from(
          colorScheme: schemeLight,
        ).copyWith(
          textTheme: themeConfig["textTheme"],
          appBarTheme: themeConfig["appBarTheme"],
        ),
        darkTheme: ThemeData.from(
          colorScheme: schemeDark,
        ).copyWith(
          textTheme: themeConfig["textTheme"],
          appBarTheme: themeConfig["appBarTheme"],
        ),
        // home: const MainScreen(),
        home: StreamBuilder(
          stream: FirebaseAuth.instance.authStateChanges(),
          builder: (context, snapshot) {
            if (snapshot.connectionState == ConnectionState.waiting) {
              return const SplashScreen();
            }

            if (snapshot.hasData) {
              context
                  .read<AppStateBloc>()
                  .add(SetUserId(id: snapshot.data!.uid));
              GetStorage().write('uid', snapshot.data!.uid);
              return const MainScreen();
            }

            return const AuthScreen();
          },
        ),
        onGenerateRoute: appRouter.onGenerateRoute,
      ),
    );
  }
}

Co tutaj jest źle, że state jest nadpisywany pustymi wartościami?