First, one thing must be clarified before moving on with my answer. Do you want your app to "remember" that the user has completed in the past the onboarding procedure, even if the user uninstalls/installs the app?
if yes, hydration is not a solution here because as soon as the user uninstalls the app, the hydrated data are deleted as well.
Assuming that the above is not the problem, what I would do is make a wrapper widget for the login page. Let's call this OnBoardingWrapper, which will accept a Widget parameter child. In our case, the child is the LoginPage.
This wrapper will have a simple logic in the builder if the onBoarding is already been done in the past, then render the LoginPage Widget, else render the OnBoarding widget.
On this Wrapper widget, a hydrated cubit can be provided which only has a state value like isOnBoardingCompleted and a method that sets this value from false to true.
So if the onBoarding is rendered, on the completion the method is called setting the value to true and displaying the login page.
if the user re-visit the app after the completion of onboarding flow, the hydrated state with the isOnBoardingCompleted == true will be retrieved and the user will skip the onboarding.