Почему не работает state.set_state() в Aiogram3?

Когда я нажимаю на "✅ Согласен", callback работает (Выводит сообщение: "Хорошо, добавляем вас в нашу базу данных, ожидайте..."), но почему-то не переходит состояние в RegistrationState.TelegramID, из-за чего дальнейшие действия не происходит. Я думаю, что всё из-за callback_query, но не уверен в этом.

Вот мой код:

bot = Bot("XXXXXXXXXX")
storage = MemoryStorage()
dp = Dispatcher(storage=storage)
router = Router()
dp.include_router(router)
database: Database = None

class RegistrationState(StatesGroup):
    TelegramID = State()
    Username = State()
    PhotoURL = State()
    FullName = State()

# ...

@router.message(CommandStart())
async def start(msg: Message, state: FSMContext):

    builder = InlineKeyboardBuilder()
    builder.add(InlineKeyboardButton(
        text="✅ Согласен",
        callback_data="agree")
    )

    with open("PRIVACY.md", encoding="UTF-8") as privacy:
        await msg.answer(privacy.read(), parse_mode="HTML", reply_markup=builder.as_markup())


@router.callback_query(lambda c: c.data == 'agree')
async def agree_callback(callback_query: CallbackQuery, state: FSMContext):
    await callback_query.answer("Хорошо, добавляем вас в нашу базу данных, ожидайте...")
    await state.set_state(RegistrationState.TelegramID)


@router.message(RegistrationState.TelegramID)
async def process_telegram_id(msg: Message, state: FSMContext):
    global database
    #...

    await msg.answer(f"Добро пожаловать, {data['FullName']}! Чтобы начать поиск объявлений, нажмите на 'Поиск'. Если вы хотите продать своего щенка, нажмите на режим 'Бизнеса'")
    await state.finish()

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

Автор решения: Aves chan

если вы хотите сделать хендлере проверку на состояние то нужно указывать в хендлере RegistrationState.TelegramID.filter() а не просто передать RegistrationState.TelegramID

@router.message(RegistrationState.TelegramID.filter()) async def process_telegram_id(msg: Message, state: FSMContext): global database #...текст курсивом

await msg.answer(f"Добро пожаловать, {data['FullName']}! Чтобы начать поиск объявлений, нажмите на 'Поиск'. Если вы хотите продать своего щенка, нажмите на режим 'Бизнеса'")
await state.finish()
→ Ссылка
Автор решения: CausonQ

Ты не записываешь в стейт ничего, поэтому там ничего и нет.

Обработка в твоем случае происходит следующим образом: При нажатии на кнопку старт бот отправляет сообщение с инлайн кнопкой. При нажатии на кнопку - срабатывает коллбэк и устанавливается стейт. Дальнейшая обработка останавливается.

Следующий хендлер сработает только при отправке боту чего-либо: сообщения, картинки, видео и тд. Потому что ты составил хендлер так:

@router.message(RegistrationState.TelegramID)
→ Ссылка