在本机导航中动态更改标题标题

时间:2019-03-19 18:37:13

标签: react-native react-redux react-navigation react-navigation-stack react-navigation-drawer

对于学校作业,我们将在react native中创建一个带有react导航和redux的应用程序。因为我们所有人都是新来的反应者,所以我们有一个无法解决的问题。

我们希望在单击某个按钮时更改标题的标题。第一次单击按钮时,它可以很好地更改标题。当我们按下其他按钮时,问题仍然存在,标题不变。请注意,无论我们选择什么选项,我们始终会转到同一屏幕。

import React from 'react';
import { createStackNavigator, createAppContainer, createDrawerNavigator } from 'react-navigation';
import {connect} from 'react-redux';
import { store } from '@redux/MyStore';
import { Ionicons } from '@expo/vector-icons';

import ScannerScreen from '@screens/ContactScreen';
import EventsScreen from '@screens/ListScreen';

const ContactStack = createStackNavigator({
    Contact: {
        screen: ContactScreen,
        navigationOptions: ({navigation}) => ({
            headerStyle: {backgroundColor: '#fa8231'},
            headerTitleStyle: {fontSize: 18},
            title: store.getState().setupState.title,
            headerLeft: <Ionicons 
            name="md-menu" style={{marginLeft:10}} 
            size={28} 
            onPress={() => navigation.toggleDrawer()} /> //menu button
        })
    }
});

// Code to create stack for the ListStack

const DrawerStack = createDrawerNavigator({
    Contact: ContactStack,
    List: ListStack
});

 const PrimaryNavigation = createStackNavigator({
    ListStack: {
        screen: ListStack,
        navigationOptions: {
            header: null,
        }, 
    },
    DrawerStack: {
        screen: DrawerStack,
        navigationOptions: {
            header: null,
        }, 
    },  
},
{
    initialRouteName: 'ListStack',
});

const AppContainer = createAppContainer(PrimaryNavigation);

class AppNavigation extends React.Component {
  render() {
    return <AppContainer/>
  }
}

export default (AppNavigation)

当我们将标题栏放在DrawerNavigator中时,确实可以使它工作,但是由于我们希望Drawer来自标头,所以这不是一个选择。我的猜测是,该堆栈仅创建了一个具有特定标题的文件,并且在使用DrawerNavigator切换屏幕时从未更新过,但是我们不知道如何解决该问题。

谢谢!

2 个答案:

答案 0 :(得分:0)

尝试一下:

地图标题作为强制ContactStack更改时重新渲染的道具

class ContactStack extends React.Component {
  render() {
    const { title } = this.props.setupState;

    const Stack = createStackNavigator({
      Contact: {
          screen: ContactScreen,
          navigationOptions: ({navigation}) => ({
              headerStyle: {backgroundColor: '#fa8231'},
              headerTitleStyle: {fontSize: 18},
              title,
              headerLeft: <Ionicons 
              name="md-menu" style={{marginLeft:10}} 
              size={28} 
              onPress={() => navigation.toggleDrawer()} /> //menu button
          })
      }
    });

    return <Stack />;
  }
}

const mapStateToProps = ({ setupState }) => ({setupState});

export default connect(mapStateToProps)(ContactStack);

答案 1 :(得分:0)

据我了解,当屏幕装入堆栈时,您需要更改标题。因此,您可以使用以下代码:

class ScreenInContactStack extends React.Component{
    //Constryctor
    static navigationOptions = ({navigation}) => ({
        title: (navigation.state.params || {}).title || 'Chat! ',
    });
    //Remaining Logic
}

并在呼叫

this.props.navigation.navigate('ScreenInContactStack', {title: yourTitle + ' ',});

不知道为什么,但是Appbar会将标题压缩为yourTi..,以避免在标题上添加空格。