У меня есть функция React Native, встроенная в приложение для Android. Мне нужно обновить ActionBar Android Activity с экрана React Native. У меня это работает, используя мост и вызывая мост из файла js.
Я столкнулся с одной проблемой в течение некоторого времени, если я перехожу с одного экрана React Native Screen на другой и заголовок панели действий обновляется правильно, но если я использую «Кнопка назад» для возврата к предыдущему экрану, он не обновляет заголовок панели действий. Вот фрагмент кода:
Bridge.java
@ReactMethod
public void setActionBarTitle(String title) {
final String actionBarTitle = title;
runOnUiThread(new Runnable() {
@Override
public void run() {
final Activity activity = getCurrentActivity();
activity.setTitle(actionBarTitle);
}
});
}
ReactScreen.js
componentDidMount() {
NativeModules.ActivityStarter.setActionBarTitle(this.props.item.defectType)
}
Я также пробовал использовать componentWillReceiveProps (), но, похоже, он не получает обратного вызова при использовании кнопки возврата в Android.
Кроме того, я использую StackNavigator из реакции-навигации, поэтому он предоставляет BackHandler, который отменяет нажатие кнопки возврата, но это не кажется правильным решением, я думаю, что один из методов жизненного цикла должен получать обратный вызов при нажатии кнопки возврата.
Вместо настройки заголовка ActionBar в componentDidMount () теперь я использую onNavigationStateChange () из навигатора и определяю текущий экран путем итерации по состояниям.
App.js
const App = () => (
<Provider store = {store}>
<Navigator
onNavigationStateChange = {(prevState, currentState) => {
if (Platform.OS === 'android') {
const prevScreen = this.findRouteNameFromNavigatorState(prevState);
const currentScreen = this.findRouteNameFromNavigatorState(currentState);
if (prevScreen !== currentScreen) {
this.setActionBarTitle(currentState, currentScreen);
}
}
}}
/>
</Provider>
);
findRouteNameFromNavigatorState = (state) => {
const route = this.getRoute(state);
if (route !== undefined)
return route.routeName;
};
Ссылка: pensierinmusica Ответ