Я новичок в React Native, поддерживающий небольшое приложение для Android. Во время тестирования я столкнулся с ошибкой модалов, которую мне не удалось устранить.
Прежде чем я вернусь к разработчику с этой ошибкой, я хотел бы попытаться понять / исправить ее самостоятельно (с вашей помощью, конечно).
Описание ошибки: при определенной последовательности действий пользовательский интерфейс приложения зависает и не реагирует на взаимодействие с пользователем. При этом аппаратные кнопки Android работают нормально.
Приложение - это базовый сканер штрих-кода, отправляющий GET-запросы на сервер и обрабатывающий ответы.
Если данные ответа содержат флаг ошибки, отображается модальное окно с соответствующей информацией и кнопками выбора.
Мне удалось точно определить случаи замораживания для следующего поведения:
Если модальное предупреждение остается активным на экране до тех пор, пока экран не заблокируется (нажатием кнопки или таймером блокировки экрана), при последующем разблокировании модальное окно больше не отображается на экране.
Несмотря на то, что модальный режим не отображается, базовый вид не реагирует на прокрутку или касание, как если бы модальный режим все еще был там. Чтобы избавиться от него, нам нужно перезапустить все приложение.
Модальный код окна
// @flow
/* imports */
type Props = {
warningText: ?string,
options: ?string[],
visible: boolean,
onPress: (value: number) => void,
}
export default class WarningModal extends PureComponent<Props> {
renderButtons = () => {
/* code omitted */
}
render() {
const { warningText, options, visible } = this.props
return (
<Modal
visible={visible}
fullScreen
transparent
onRequestClose={() => {}}
>
<View>
<View>
<Text>Title</Text>
<View>
<Text>{warningText}</Text>
</View>
{options && options.length > 0 ? this.renderButtons() : undefined}
</View>
</View>
</Modal>
)
}
}
Единственные два места в приложении, где showModal имеет значение false, находятся в классе SceneComponent следующим образом:
- при инициализации переменной состояния:
state = {
unitInfo: new Unit(),
showModal: false,
}
- в методе, который обрабатывает нажатие кнопки опции в модальном окне
onWarningPress = async (value: number) => {
const {
userStore: {
state: {
user,
},
},
} = this.props
const { unitInfo } = this.state
try {
await saveWarning(value, user)
this.setState({ showModal: false })
} catch (error) {
Alert.showAlert()
}
}
Пока что я не смог найти решение этой проблемы, поэтому я надеюсь, что вы можете указать мне правильное направление, как избежать закрытия мод без взаимодействия с пользователем.
Желаемое поведение заключается в том, что модальное предупреждение остается на экране неограниченное время, пока пользователь не нажмет кнопку выбора.