You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Aiogram FSM无法跳转至LowPrice.result_without_photo状态问题排查

问题根因

Aiogram 的 message_handler 只有接收到用户新发送的消息时才会触发对应状态的处理函数。你在 get_answer_about_photo 中调用 await LowPrice.result_without_photo.set() 只是修改了当前用户的FSM状态,并没有产生新的消息事件,所以绑定了LowPrice.result_without_photo状态的handler永远不会被触发。

可行解决方案

方案1:直接调用目标处理函数(最适配你的场景)

你不需要等待用户新输入,直接在判定用户不需要照片后,调用result_without_photo函数即可,同时传递当前的message和state对象:

@dp.message_handler(state=LowPrice.photo)
async def get_answer_about_photo(message: types.Message, state: FSMContext):
    answer = message.text
    await state.update_data(if_photo_need=answer)
    if answer.lower() == 'yes': # 新增lower避免大小写匹配失败
        await message.answer('How many photos to show?')
        await LowPrice.quantity_photo.set()
    elif answer.lower() == 'no': # 新增lower避免大小写匹配失败
        await message.answer('Fine, I am starting to find hotels')
        await LowPrice.result_without_photo.set()
        # 新增这一行直接执行对应逻辑
        await result_without_photo(message, state)

你可以在result_without_photo逻辑执行完成后调用await state.finish()清除当前状态,避免状态残留影响后续命令触发。

方案2:绑定状态变更触发器(可选,适合复杂流转场景)

如果你的业务需要严格通过状态变更触发逻辑,可以绑定aiogram的state_updated信号监听状态切换事件,匹配到目标状态后执行对应逻辑,不过这个方案对你当前的场景冗余度较高,不优先推荐。

额外排查点
  • 确认状态类LowPrice是正确导入到handler文件中的,没有出现同名状态类引用错误
  • 如果你有其他全局的消息handler,确认没有提前拦截对应状态的消息事件

内容的提问来源于stack exchange,提问作者kaucap

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 14:15:05