На aiogram не подскажу конкретного решения. Но как бы сделал я на примере pytelegrambotapi.
Думаю структура будет понятна, и сможешь сделать на aiogram.
Словарь хранящий в себе user_id : Страница на которой находиться
user_page = dict
Список inline кнопок
buttons = list
Для удобства, отдельная функция для клавиатуры, куда передаем user_id
def inline_keyboard(user_id):
markup = InlineKeyboardMarkup()
# Достаем страницу. Будет идти с 0
page = user_page[user_id]
# Кол-во кнопок которые будем менять, по сути индекс.
step = 2
for i in range(page, page+2):
markup.add(buttons[i+]
btn_next = InlineKeyboardButton(text='>', callback_data = 'next')
btn_back = InlineKeyboardButton(text='<', callback_data = 'back')
return markup
Соответственно в обработке колбеков на next прибавляем к странице step, на back отнимаем.
После, редактируем уже существующее сообщение.
Пишем проверку, чтобы пользователь не мог выйти за рамки массива.
Вызываем где нужно
reply_markup = inline_keyboard(message.user_id)
Должно быть все просто. Удачи!