Как изменить исходное местоположение реакции-маршрутизатора при обратном вызове собственного модуля - PullRequest
0 голосов
/ 18 апреля 2019

Я создаю собственное приложение, которое отображает наложение служб (например, всплывающие подсказки в мессенджере 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" />)}

Может ли как-нибудь обойти это? Спасибо

1 Ответ

0 голосов
/ 18 апреля 2019

Нашел решение, не знаю, лучшее ли, но оно работает.

Создано синглтоном navigation.js

navigation.js

export default {
    entryPoint: '/home'
};

И изменили следующие файлы:

Search.js

<Button onPress={() => FloatingView.init(() => {
   navigation.entryPoint = "/progress";
})}

Main.js

componentDidMount() {
    if(this.props.location.pathname === '/') {
        this.props.history.push(navigation.entryPoint);
    }       
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...