Ошибка ValueError в aiogram 2

Имеется такой код:

async def get_login(message: types.Message, state=dp.current_state()):

    user_id = message.from_user.id

    await state.update_data(user_id=user_id)
    await state.update_data(user_login=message.text)

    await message.bot.send_message(user_id, "Теперь введи свой пароль:")
    # Сбрасываем состояние
    await state.reset_state()
    # Регистрируем обработчик ответа на пароль
    await dp.register_message_handler(get_password, state="waiting_for_password")

async def get_password(message: types.Message, state=dp.current_state()):

    user_login = (await state.get_data()).get('login')
    user_id = message.from_user.id
    user_credentials[user_id] = (user_login, message.text)
    await message.bot.send_message(user_id, "Спасибо! Давай проверим твои данные.")
    # Сбрасываем состояние


    state_data = await state.get_data()
    user_id = state_data.get("user_id")

    if user_id in user_credentials:
        user_login, user_password = user_credentials[user_id]
    
    await message.answer(user_id, f"Твой профиль {response.get_profile(user_login, user_password)}?", reply_markup=keyboard)

При запуске жалуется на функцию get_login() и выдает ошибку ValueError: userorchat parameter is required but no one is provided!. Не понимаю в чем дело. Помогите пожалуйста.

Полный текст ошибки:

Traceback (most recent call last):
  File "/Users/user/Desktop/moodle bot/BOT/BotMain.py", line 43, in <module>
    async def get_login(message: types.Message, state=dp.current_state()):
  File "/Users/user/Desktop/moodle bot/venv/lib/python3.9/site-packages/aiogram/dispatcher/dispatcher.py", line 1261, in current_state
    return FSMContext(storage=self.storage, chat=chat, user=user)
  File "/Users/user/Desktop/moodle bot/venv/lib/python3.9/site-packages/aiogram/dispatcher/storage.py", line 295, in __init__
    self.chat, self.user = self.storage.check_address(chat=chat, user=user)
  File "/Users/user/Desktop/moodle bot/venv/lib/python3.9/site-packages/aiogram/dispatcher/storage.py", line 56, in check_address
    raise ValueError('`user` or `chat` parameter is required but no one is provided!')
ValueError: `user` or `chat` parameter is required but no one is provided!

Ответы (1 шт):

Автор решения: Deniska SosiSka

Ошибка возникает из за того что при создании экземпляра FSMContext (который используется в dp.current_state()) не передается ни один из обязательных параметров user или chat.

В вашем случае, вы пытаетесь использовать dp.current_state() внутри определения функции get_login(), но на момент ее определения еще нет информации о пользователе или чате.

Чтобы исправить ошибку, уберите state=dp.current_state() из определения функции get_login() и добавьте его в качестве параметра при регистрации обработчика сообщений. Мой вариант:

async def get_login(message: types.Message):
    user_id = message.from_user.id

    # Создаем состояние и получаем его экземпляр
    state = dp.current_state(user=user_id)

    await state.update_data(user_id=user_id)
    await state.update_data(user_login=message.text)

    await message.bot.send_message(user_id, "Теперь введи свой пароль:")
    # Сбрасываем состояние
    await state.reset_state()
    # Регистрируем обработчик ответа на пароль
    await dp.register_message_handler(get_password, state="waiting_for_password", user_id=user_id)
→ Ссылка