Как остановить FSM в aiogram3.0.0b7?

Рейтинг: 0Ответов: 3Опубликовано: 01.06.2023

Я изучаю aiogram 3 b7 и столкнулся с проблемой, что не знаю как остановить состояние FSM. я видел решение использовать await state.finish(), но на 3 aiogram оно не работает. как мне сделать это? Код:

cansel = Router()

@cansel.message(Text(text=["❌ отмена"], ignore_case=True))
async def cmd_cansel(message: types.Message, state: FSMContext):
    

Ответы

▲ 1
from aiogram.filters import Command
from aiogram import F, Router

router : Router = Router() # твой роутер

@router.message(Command("cancel"))  # Сработает при команде /cancel
@router.message(F.text.casefold() == "cancel") # И если в сообщение есть "cancel"
async def cancel_handler(message: Message, state: FSMContext) -> None:
    current_state = await state.get_state()  # Получаем текущий state
    if current_state is None:  # Если его нет, то ничего не возвращаем
        return    
    '''А вот иначе, завершаем state и прописываем в лог'''
    lg.info("Cancelling state %r", current_state)
    await state.clear()
    await message.answer("Вы отменили действие")
▲ 0

Я нашёл решение, но не уверен лучшее ли оно. Решение:

await state.set_state(None)
▲ 0
await state.clear()

убирает текущее состояние (стоит заметить что update_data которая там храниться, если вы ее добавили пропадет)