我在Android应用程序中嵌入了React Native功能。我需要从React Native Screen更新Android Activity的ActionBar。我通过使用Bridge并从js文件调用桥来实现此功能。
我现在面临一个问题,如果我从一个React Native屏幕导航到另一个并且Action栏标题正确更新,但是如果我使用" 后退按钮 "要返回上一个屏幕,它不会更新操作栏标题。以下是代码段:
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中使用后退按钮时似乎没有得到回调。
另外,我正在使用来自react-navigation的StackNavigator,因此它提供BackHandler,它会覆盖后退按钮按下,但它似乎不是一个正确的解决方案,我认为其中一个生命周期方法应该得到一个回调在背面按下。
答案 0 :(得分:0)
不是在componentDidMount()中设置ActionBar标题,而是使用导航器中的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;
};