Я создаю собственное приложение, которое отображает наложение служб (например, всплывающие подсказки в мессенджере Facebook), внедряет только в Android, и при щелчке наложения оно должно вернуться к приложению на определенном экране.
Я использую native-router-native и мои маршруты структурированы следующим образом:
App.js
<NativeRouter>
<ApolloProvider client={client}>
<Main>
<Switch>
<Route exact path="/home" component={Home} />
<Route exact path="/progress" component={RouteProgress} />
<Route exact path="/search" component={Search} />
</Switch>
</Main>
</ApolloProvider>
</NativeRouter>
Компонент Main
имеет следующие данные:
Main.js
componentDidMount() {
console.log(this.props.location.pathname);
if(this.props.location.pathname === '/') {
this.props.history.push("/home");
}
}
Обратный вызов из моего Native модуля вызывается так:
FloatingView.java
case MotionEvent.ACTION_UP:
if (lastAction == MotionEvent.ACTION_DOWN || delta < 3) {
Intent intent = new Intent(FloatingWindow.this, MainActivity.class);
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
FloatingViewPackage.callback.invoke();
stopSelf();
}
Обратный вызов определен в компоненте Search
, который также выполняет собственный модуль:
Search.js
<Button onPress={() => FloatingView.init(() => {
console.log('go to progress 1');
this.props.history.push("/progress");
setTimeout(() => {
console.log('go to progress 2');
this.props.history.push("/progress");
}, 1000);
})}
Проблема в том, что this.props.history.push("/progress");
не работает ни вне таймаута, ни внутри.
Вне времени ожидания функция вызывается до Main
componentDidMount
, но location.pathname
не обновляется. Внутри него вызывается функция after, но она не переходит на нужный экран. Это всегда попадает в /home
.
Я подумал, что это проблема жизненного цикла, поскольку компонент поиска не смонтирован. Я пытался найти выход, чтобы сделать эту работу. Я пытался использовать компонент Redirect
:
<Button onPress={() => FloatingView.init(() => <Redirect to="/progress" />)}
Может ли как-нибудь обойти это? Спасибо