я не работал с провайдером но судя по ошибке и логике работы провайдера в блоке у тебя провайдер не знаходится в контексте который ты вызываешь этот экран, используй билдер для этого
В интернетах все есть. Мог бы и погуглить. Создаешь экземпляр класса FoucusNode, передаешь его в TextFormField в параметр focusNode. Когда надо проверить просто обращаешься к геттеру focusNode.hasFocus.