简体   繁体   English

如何从createMaterialTopTabNavigator导航到其他屏幕-React Navigation?

[英]How To navigate from createMaterialTopTabNavigatorto other screen - React Navigation?

I have some issue when navigating from top Tabnavigator to other screens so my app navigation is 从顶部Tabnavigator导航到其他屏幕时遇到一些问题,因此我的应用程序导航是

My Orders Screen from Drawer => Top TabNavigatore (Accepted/Completed) => Order Details 抽屉中的“我的订单”屏幕=>顶部TabNavigatore(已接受/已完成)=> 订单详细信息

In Route.js I put every single navigation I want like Drawer - Auth navigation and so on, and I put a StackNavigator contain the Orders Screen like this: 在Route.js中,我放置了每个我想要的导航,例如Drawer-Auth导航等等,然后我将一个StackNavigator包含了Orders屏幕,如下所示:

const OrdersStack = createStackNavigator({
  Orders: {
    screen: Orders,
    navigationOptions: ({ navigation }) => ({
      headerLeft: (
        // <TouchableOpacity onPress={() => navigation.dispatch(DrawerActions.toggleDrawer())}>
        <TouchableOpacity
          onPress={() => navigation.dispatch(DrawerActions.toggleDrawer())}
        >
          <Icon
            name="ios-menu"
            size={40}
            style={{ margin: 10 }}
            color="#2F98AE"
          />
        </TouchableOpacity>
      ),
      headerRight: <View />,
      title: "My Orders",
      headerTintColor: "#2F98AE",
      headerStyle: {
        borderBottomColor: "white"
      },
      headerTitleStyle: {
        color: "#2F98AE",
        // textAlign: "center",
        flex: 1,
        elevation: 0,
        fontSize: 25
        // justifyContent: "center"
      }
    })
  }
});

In the Orders.js I put these: 在Orders.js中,我输入了以下内容:

import React, { Component } from "react";
import { createAppContainer, createStackNavigator } from "react-navigation";
import NavTabs from "../screens/NavTabs";
import NavOrderDetails from "../screens/NavOrderDetails";

// create a component
export default class Orders extends Component {
  render() {
    return <MyOrdersScreen />;
  }
}

export const root = createStackNavigator({
  NavTabs: NavTabs,
  NavOrderDetails: NavOrderDetails
});

const MyOrdersScreen = createAppContainer(root);

As I mentioned in Orders.js it Contains Tabs and Order Details 正如我在Orders.js中提到的那样,它包含选项卡和订单详细信息

In Tabs, I'm creating a createMaterialTopTabNavigator 在标签中,我正在创建一个createMaterialTopTabNavigator

import { createMaterialTopTabNavigator } from "react-navigation";
import AcceptedOrders from "../screens/AcceptedOrders";
import CompletedOrders from "../screens/CompletedOrders";

const MainTabs = createMaterialTopTabNavigator(
  {
    Accepted: { screen: AcceptedOrders },
    Completed: { screen: CompletedOrders }
  },
  {
    tabBarOptions: {
      activeTintColor: "#fff",
      inactiveTintColor: "#ddd",
      tabStyle: {
        justifyContent: "center"
      },
      indicatorStyle: {
        backgroundColor: "#fcc11e"
      },
      style: {
        backgroundColor: "#2F98AE"
      }
    }
  }
);
export default MainTabs;

and another screen is OrderDeatils.js 另一个屏幕是OrderDeatils.js

import { createStackNavigator } from "react-navigation";
import OrderDetails from "../screens/OrderDetails";
import React, { Component } from "react";
import { View } from "react-native";
const OrderDetailsStack = createStackNavigator({
  OrderDetails: {
    screen: OrderDetails,
    navigationOptions: () => ({
      title: "Order Details",
      headerRight: <View />,
      headerTintColor: "#2F98AE",
      headerStyle: {
        borderBottomColor: "white"
      },
      headerTitleStyle: {
        color: "#2F98AE",
        flex: 1,
        elevation: 0,
        fontSize: 25
      }
    })
  }
});
export default OrderDetailsStack;

Here are a screenShots it should explain what I mean 这是一个屏幕截图,它应该解释我的意思

1- My Orders 1-我的订单 我的订单

2- Order Details 2订单详细信息 订单详细信息

If i understand, you are concerned about the blank header that appears on top of the screen under your first header. 据我了解,您担心屏幕顶部第一个标题下方出现空白标题。

That one is created by createStackNavigator . 那是由createStackNavigator创建的。

A the first Stack that creates the first Header named OrdersStack . 一个第一个Stack,它创建第一个名为OrdersStack Header。

Inside that you have the root constant (probably, as there isn't the full code) that is creating the second header. 在其中,您具有创建第二个标头的root常量(可能是因为没有完整的代码)。

Inside root you are then defining your createMaterialTopTabNavigator with your two screens, that's showing the topBar with the label "accepted" and "completed". root内部,然后用两个屏幕定义createMaterialTopTabNavigator ,这将显示topBar带有标签“ accepted”和“ completed”。

To hide that white space you have to disable your root header doing: 要隐藏空白,您必须禁用root标头:

export const root = createStackNavigator({
  NavTabs: NavTabs,
  NavOrderDetails: NavOrderDetails
},
   {
     defaultNavigationOptions:{
       header:null
   }
});

UPDATE. 更新。

You have two ways to fix this and still have a backButton: 您有两种方法可以解决此问题,但仍然有一个backButton:

1) You can either create a parent CustomHeader that, using react-navigation's withNavigation HOC, is aware about his childrens navigation state. 1)您可以创建一个父CustomHeader ,它使用react-navigation的withNavigation HOC知道他的孩子的导航状态。

2) Dinamically hide the parent header when the second one is showing. 2)显示第二个时,动态隐藏父标题。 You can accomplish this using this.props.navigation.dangerouslyGetParent().dangerouslyGetParent().setParams({showHeader:false}) then your OrdersStack would be: 您可以使用this.props.navigation.dangerouslyGetParent().dangerouslyGetParent().setParams({showHeader:false})完成此操作,然后您的OrdersStack将是:

 const OrdersStack = createStackNavigator({
Orders: {
  screen: Orders,
  navigationOptions: ({ navigation }) => {
    var defaultHeader={
        headerLeft: (
        <TouchableOpacity
            onPress={() => navigation.dispatch(DrawerActions.toggleDrawer())}
        >
            <Icon
            name="ios-menu"
            size={40}
            style={{ margin: 10 }}
            color="#2F98AE"
            />
        </TouchableOpacity>
        ),
        headerRight: <View />,
        title: "My Orders",
        headerTintColor: "#2F98AE",
        headerStyle: {
        borderBottomColor: "white"
        },
        headerTitleStyle: {
        color: "#2F98AE",
        // textAlign: "center",
        flex: 1,
        elevation: 0,
        fontSize: 25
        // justifyContent: "center"
        }
    }
    if (navigation.state.params)
        return(navigation.state.params.showHeader?{defaultHeader}:null)
    else return defaultHeader

  }
}


 });

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM