【问题标题】:How To navigate from createMaterialTopTabNavigatorto other screen - React Navigation?如何从 createMaterialTopTabNavigator 导航到其他屏幕 - React Navigation?
【发布时间】:2019-11-21 18:26:27
【问题描述】:

从顶部 Tabnavigator 导航到其他屏幕时遇到一些问题 所以我的应用导航是

抽屉中的我的订单屏幕 => 顶部 TabNavigatore(已接受/已完成)=> 订单详情

在 Route.js 中 我放了我想要的每一个导航,比如 Drawer - Auth 导航等等,我放了一个包含 Orders Screen 的 StackNavigator,如下所示:

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"
      }
    })
  }
});

我在 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);

正如我在 Orders.js 中提到的,它包含选项卡和订单详细信息

在选项卡中,我正在创建一个 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;

另一个屏幕是 OrderDeutils.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;

这是一个屏幕截图,它应该解释我的意思

1- 我的订单

2- 订单详情

【问题讨论】:

  • 不太了解您的问题,但如果您询问其他问题中的空白标题,您可以通过将 defaultNavigationOptions: {header: null} 添加到名为 root 的堆栈导航器来隐藏它
  • 是的,这就是我想要的,但是当我将它设置为 root 和订单详细信息的“header:null”时,它工作得很好,但是如果用户想返回!这不会发生,因为标题消失了:/ 如果我只是为根设置一个“标题:null”,并且在订单详细信息中我将看到两个标题(我的订单,订单详细信息)! @tuan.tran
  • 您能否重命名文件名并发布这些文件的代码并提及名称,现在很混乱。很难调试。
  • 我现在将一个标题隐藏起来,你能检查这个 Q @AshwinMothilal stackoverflow.com/questions/57065752/…

标签: javascript reactjs react-native redux react-navigation


【解决方案1】:

如果我理解,您担心出现在屏幕顶部的第一个标题下方的空白标题。

那个是createStackNavigator创建的。

创建第一个名为 OrdersStack 的 Header 的第一个 Stack。

在其中您有创建第二个标头的 root 常量(可能是因为没有完整的代码)。

root 中,您将使用两个屏幕定义您的 createMaterialTopTabNavigator,即显示带有“已接受”和“已完成”标签的 topBar。

要隐藏该空白,您必须禁用 root 标头:

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

更新。

你有两种方法可以解决这个问题,但仍然有一个返回按钮:

1) 您可以创建一个父 CustomHeader,使用 react-navigation 的 withNavigation HOC,知道他的子导航状态。

2) 在显示第二个标题时动态隐藏父标题。您可以使用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

  }
}


 });

【讨论】:

  • 是的,这就是我想要的,但是当我将它设置为 root 和订单详细信息的“header:null”时,它工作得很好,但是如果用户想返回!这不会发生,因为标题消失了:/ 如果我只是为根设置一个“标题:null”,并且在订单详细信息中我将看到两个标题(我的订单,订单详细信息)! @Auticcat
  • 我可以把this.props.navigation.dangerouslyGetParent().dangerouslyGetParent().setParams({showHeader:false}) 放在哪个屏幕上?
  • 比如orderDetails的componentDidMount里面
  • 刚注意到有3个标题,你能把你的导航结构更好地展示给我吗?
  • 嘿@Auticcat,我希望你没事,我遇到过类似的问题,你可以检查this的问题吗?
猜你喜欢
  • 2020-06-09
  • 2021-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-29
  • 2022-11-19
相关资源
最近更新 更多