【问题标题】:Passing data between Stack navigators in one Drawer navigator在一个抽屉导航器中的堆栈导航器之间传递数据
【发布时间】:2020-08-20 05:12:52
【问题描述】:

是否可以在一个抽屉导航器中的两个堆栈导航器之间传递数据? 即:

-抽屉导航A --StackNavigationA --StackNavigationB

我想将一些数据(您可以在下面的代码中看到)从 StackNavigationB 传递到 StackNavigationA。我需要做什么?我正在寻找第 3 天的解决方案,但我一无所获。

App.js

import React from 'react';
import Navigator from './routes/drawer';

export default function App() {
  return (
    <Navigator />
  );
}

Home.js

import React from 'react';
import { StyleSheet, View, Text } from 'react-native';

export default function Home({ navigation }) {
  return (
    <View style={styles.container}>
      <Text> Hello {/* here i want to show a passed value from ChooseName */} from home! </Text>
    </View>
  );
}

const styles = StyleSheet.create({
    container: {
        flex: 1,
        justifyContent: 'center',
        alignItems: 'center'
    }
});

ChooseName.js

import React, { useState } from 'react';
import { StyleSheet, View, Text, TouchableOpacity, FlatList } from 'react-native';

export default function ChooseName({ navigation }) {
  const [names, setNames] = useState([
    { name: 'Adam', key: '1' },
    { name: 'Ivan', key: '2' },
    { name: 'Josh', key: '3' },
  ]);

  //after clicking on the name
  const onPressHandler = (name) => {
    // //Do something to pass name to Home screen
    // //and navigate to Home screen
    navigation.navigate('HomeStack');
    console.log('hello' + name);
  }

  return (
    <View style={styles.container}>
      <FlatList data={names} renderItem={({ item }) => (
        <TouchableOpacity onPress={() => onPressHandler(item.name)}>
          <Text style={styles.name}>{ item.name }</Text>
        </TouchableOpacity>
      )} />
    </View>
  );
}

const styles = StyleSheet.create({
    container: {
        flex: 1,
        justifyContent: 'center',
        alignItems: 'center'
    },
    name: {
        padding: 10,
        marginBottom: 10,
    }
});

HomeStack.js

import { createStackNavigator } from 'react-navigation-stack';
import Home from '../screens/Home';

const screens = {
  Home: {
    screen: Home,
    navigationOptions: {
        title: 'Home',
    },
  },
};

const HomeStack = createStackNavigator(screens, {
  defaultNavigationOptions: {
    headerTintColor: '#444',
    headerStyle: { backgroundColor: '#eee', height: 60 }
  }
});

export default HomeStack;

选择NameStack.js

import { createStackNavigator } from 'react-navigation-stack';
import ChooseName from '../screens/ChooseName';

const screens = {
    ChooseName: {
        screen: ChooseName,
        navigationOptions: {
            title: 'ChooseName'
        },
    },
}

const AboutStack = createStackNavigator(screens, {
  defaultNavigationOptions: {
    headerTintColor: '#444',
    headerStyle: { backgroundColor: '#eee', height: 60 },
  }
});

export default AboutStack;

router.js

import { createDrawerNavigator } from 'react-navigation-drawer';
import { createAppContainer } from 'react-navigation';

// stacks
import HomeStack from './HomeStack';
import ChooseNameStack from './ChooseNameStack';

// drawer navigation options
const RootDrawerNavigator = createDrawerNavigator({
    HomeStack: {
        screen: HomeStack,
    },
    ChooseNameStack: {
        screen: ChooseNameStack,
    },
});

export default createAppContainer(RootDrawerNavigator);

导航版本

"react-navigation": "^4.3.9",
"react-navigation-drawer": "^2.4.13",
"react-navigation-stack": "^2.4.0"

如您所见,我想在单击 Touchable 时将名称从 ChooseName 传递到 Home,然后导航到主页。

感谢您的回复。

【问题讨论】:

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


    【解决方案1】:

    您可以将它作为道具传递,例如:navigation.navigate("Home",{'id':2222}),您可以在下一条路线中获得它。希望对你有帮助

    您将代码中ChooseName.js navigation.navigate('HomeStack'); 中的这一行更改为navigation.navigate('HomeStack',{name:name})

    然后在您的 Home.js 中将此 export default function Home({ navigation }) 更改为 export default function Home({ navigation, route }) 并添加 console.log(route)console.log(navigation) 以了解全部情况

    【讨论】:

    • 如果您传递它们(两个堆栈都通过您的抽屉导航器),这意味着无论何时从您的应用程序导航到它们都可以导航。
    • 所以就像我说的那样通过并记录道具是否会被导航
    • 并将其更改为function Home({ navigation, route }) 并记录两者,您将完全了解情况
    • 您能简单地编辑我的代码并将其粘贴到 pastebin 中吗?有点不明白你的想法。谢谢
    • 路由未定义:/当我从 Home trought Drawer Navigation 导航到 ChooseName,然后通过 navigation.navigate('HomeStack', {name:name}) 从 ChooseName 返回到 Home 时,它​​没有重新渲染主屏幕,因此日志不起作用。日志仅在我将 ChooseName 设置在抽屉而不是 Home 的第一个位置的情况下才有效,但 console.log(route) 仍然未定义。
    猜你喜欢
    • 1970-01-01
    • 2018-03-26
    • 2018-12-09
    • 2020-11-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-14
    • 1970-01-01
    相关资源
    最近更新 更多