没有在堆栈导航器中传递参数

时间:2017-09-20 20:37:25

标签: react-native navigation

我正在玩创建一个跟踪工单的反应原生应用。我有一个主屏幕,作为工作人员的提要,从config / data.js文件中获取数据。我希望能够点击一个工单并将其转到显示键#和工作顺序名称的屏幕,但目前只在我的onLearnMore函数中使用硬编码参数。

这是我的Home.js文件:

import React, { Component } from "react";
import { ScrollView, Text, View } from "react-native";
import { Card, Button } from "react-native-elements";
import { workOrders } from "../config/data";

class Home extends Component {
onLearnMore = (workOrders) => {
    this.props.navigation.navigate('WorkOrder', { key: 1, name: "Job 1"});
};

render() {
    return (
      <View style={{ flex: 1 }}>
        <ScrollView contentContainerStyle={{ paddingVertical: 20 }}>
          {workOrders.map(({ key, name }) => (
            <Card title={`Work Order ${key}`} key={key}>
              <Text style={{ marginBottom: 10 }}>
                {name}.
              </Text>
              <Button
                backgroundColor="#03A9F4"
                title="VIEW NOW"
                onPress={() => this.onLearnMore(workOrders)}
              />
            </Card>
          ))}
        </ScrollView>
      </View>
    );
}
}

export default Home;

这是我的WorkOrder.js文件:

import React, { Component } from "react";
import { View, Navigator, ScrollView } from "react-native";
import { Card, Button, Text, List, ListItem } from "react-native-elements";
import { isSignedIn } from "../auth";

class WorkOrder extends Component {
render() {
    const{ key, name } = this.props.navigation.state.params;

    return(
        <ScrollView>
            <List>
                <ListItem
                    title="Key"
                    rightTitle={'$key'}
                    hideChevron
                />
                <ListItem
                    title="Name"
                    rightTitle={'$name.toUpperCase()'}
                    hideChevron
                />
            </List>
        </ScrollView>
    );
}
}

export default WorkOrder;

最后我的router.js文件,如果有帮助:

import React from "react";
import { Platform, StatusBar } from "react-native";
import { StackNavigator, TabNavigator } from "react-navigation";
import { FontAwesome } from "react-native-vector-icons";

import SignUp from "./screens/SignUp";
import SignIn from "./screens/SignIn";
import Home from "./screens/Home";
import Profile from "./screens/Profile";
import WorkOrder from "./screens/WorkOrder";

const headerStyle = {
 marginTop: Platform.OS === "android" ? StatusBar.currentHeight : 0
};

export const SignedOut = StackNavigator({
 SignUp: {
 screen: SignUp,
 navigationOptions: {
    title: "Sign Up",
    headerStyle
 }
},
SignIn: {
   screen: SignIn,
   navigationOptions: {
      title: "Sign In",
      headerStyle
  }
 },
});

export const FeedStack = StackNavigator ({
    Home: {
        screen: Home,
        navigationOptions: {
           title: 'Home',
       }
    },
    WorkOrder: {
       screen: WorkOrder,
       navigationOptions: ({ navigation }) => ({
          title: '${navigation.state.params.name}',
      }),
  },
});

   export const SignedIn = TabNavigator(
     {
       Home: {
         screen: FeedStack,
         navigationOptions: {
        tabBarLabel: "Home",
        tabBarIcon: ({ tintColor }) =>
          <FontAwesome name="home" size={30} color={tintColor} />
      }
    },
    Profile: {
      screen: Profile,
      navigationOptions: {
        tabBarLabel: "Profile",
        tabBarIcon: ({ tintColor }) =>
          <FontAwesome name="user" size={30} color={tintColor} />
      }
    },

  },
  {
    tabBarOptions: {
      style: {
        paddingTop: Platform.OS === "android" ? StatusBar.currentHeight : 0
      }
    }
  }
);

export const createRootNavigator = (signedIn = false) => {
  return StackNavigator(
    {
      SignedIn: {
        screen: SignedIn,
        navigationOptions: {
          gesturesEnabled: false
        }
      },
      SignedOut: {
        screen: SignedOut,
        navigationOptions: {
          gesturesEnabled: false
        }
      }
    },
    {
      headerMode: "none",
      mode: "modal",
      initialRouteName: signedIn ? "SignedIn" : "SignedOut"
    }
  );
};

我是反应原生的新手,并且已经使用了很多不同的教程来达到这一点。我还有一个github repo与这段代码,如果它有帮助: https://github.com/ryanseery/reactNativeBoilerPlate.git

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

我已经通过将单个工作单映射到orderDetail对象然后将这些参数推送到下一页来解决了这个问题。如果有人有兴趣,请参阅下面的代码。

import React, { Component } from "react";
import { ScrollView, Text, View } from "react-native";
import { Card, Button } from "react-native-elements";
import { workOrders } from "../config/data";

class Home extends Component {
onLearnMore = (orderDetail) => {
    this.props.navigation.navigate('WorkOrder', { ...orderDetail });
};

render() {
    return (
      <View style={{ flex: 1 }}>
        <ScrollView contentContainerStyle={{ paddingVertical: 20 }}>
          {workOrders.map((orderDetail) => (
            <Card title={`Work Order ${orderDetail.key}`}>
              <Text style={{ marginBottom: 10 }}>
                {orderDetail.name}.
              </Text>
              <Button
                backgroundColor="#03A9F4"
                title="VIEW NOW"
                onPress={() => this.onLearnMore(orderDetail)}
              />
            </Card>
          ))}
        </ScrollView>
      </View>
    );
   }
  }

   export default Home;
相关问题