Как правильно указать аргумент в деклораторе '@dp.message_handler()', чтобы я мог записать в переменную число отправленное пользователем (aiogram)

Мне нужно положить число отправленное пользователем в переменную, но при вызове функции, ее вызов повторяется и бот не вызывает следующую функцию

@dp.message_handler(lambda message: message.text == 'Я ее знаю!' or message.text == 'Теперь я знаю!')
async def weight_know(message: types.Message):
    await bot.send_message(message.from_user.id, 'Тогда проинформируйте меня.\n\nP.S. пишите только числа, без физических величин, иначе конечный результат приведет к ошибке. [Последующих вопросов это тоже касается].')

# --- Growth and The Weight

@dp.message_handler()
async def growth(message: types.Message):
    
    # Adding weight to the database
    global user_weight
    user_weight = message.text

    await bot.send_message(message.from_user.id, 'А сейчас мне нужен ваш рост')

# --- Growth and Age ---

@dp.message_handler()
async def age(message: types.Message):
    global user_growth
    user_growth = message.text

    await bot.send_message(message.from_user.id, 'И под конец я должен узнать ваш возраст.')

Результат сейчас:

Желаемый результат:

введите сюда описание изображения


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

Автор решения: oleksandrigo

Вот. Если есть вопросы задавайте.

from aiogram import Bot, Dispatcher, executor, types
from aiogram.contrib.fsm_storage.memory import MemoryStorage
from aiogram.dispatcher import FSMContext
from aiogram.dispatcher.filters.state import StatesGroup, State

import config

bot = Bot(token=config.BOT_TOKEN)
storage = MemoryStorage()
dp = Dispatcher(bot, storage=storage)


class FSM_Input(StatesGroup):
    weight = State()
    growth = State()
    age = State()


@dp.message_handler(text=['Я ее знаю!', 'Теперь я знаю!'])
async def start(message: types.Message):
    await message.answer(
        'Тогда проинформируйте меня о вашем весе.\n\n'
        'P.S. пишите только числа, без физических величин.'
        '[Последующих вопросов это тоже касается].')
    # запускаем стейт, теперь будут срабатывать только те хендлеры
    # которые в фильтре имеют state=FSM_Input.weight
    await FSM_Input.weight.set()


# делаем проверку число ли то что ввел юзер и стоит ли нужное на состояние
@dp.message_handler(lambda msg: msg.text.isdigit(), state=FSM_Input.weight)
async def get_weight(message: types.Message, state: FSMContext):
    # записываем данные в стейт, после мы сможем получить их
    async with state.proxy() as data:
        data["weight"] = message.text
    await message.answer('А сейчас мне нужен ваш рост')
    # функция которая запускает следующий стейт в FSM_Input
    # в целом можно просто каждый руками сетить, вот так
    # await FSM_Input.growth.set()
    await FSM_Input.next()


@dp.message_handler(lambda msg: msg.text.isdigit(), state=FSM_Input.growth)
async def get_growth(message: types.Message, state: FSMContext):
    async with state.proxy() as data:
        data["growth"] = message.text
    await message.answer('А сейчас мне нужен ваш возраст')
    await FSM_Input.next()


@dp.message_handler(lambda msg: msg.text.isdigit(), state=FSM_Input.age)
async def get_age(message: types.Message, state: FSMContext):
    async with state.proxy() as data:
        data["age"] = message.text
        await message.answer(f'Ваш вес: {data["weight"]}\n'
                             f'Ваш рост: {data["growth"]}\n'
                             f'Ваш возраст: {data["age"]}\n')
    await state.finish()
    # теперт после этой строки стейт сброшен, и все данные в нем удалены
    # заранее сделайте с ними что-то иначе они будут утеряны


if __name__ == '__main__':
    executor.start_polling(dp, skip_updates=True)

введите сюда описание изображения

→ Ссылка