у меня он вызывается 1 раз. я установил флаг с помощью стейта bool
Починил? ну да, флаг тоже норм. А так получение с сервера это эффект, поэтому делаешь useEffect, и на промисах внутри асинхронно получаешь ответ и дальше в стейт записываешь. при это useEffect вторым параметром пустой массив, чтобы один раз отработал. НО! Лучше конечно использовать стейт менеджмент и такие вещи как получение данных с сервера делать в бизнес слое, типа саги, на карай костыль tanks.