невозможно передать навигационные реквизиты ч / б экранов с реактивной навигацией - PullRequest
2 голосов
/ 20 июня 2020

В моем компоненте ContactList я визуализировал одни элементы с помощью карты. Каждый элемент содержит миниатюру. Когда я нажимаю на миниатюру, я хочу перейти на новый экран с именем UserDetailsScreen. Во время навигации я также хочу передать на следующий экран данные о конкретном пользователе, на миниатюре которого щелкнули.

Модальные окна не работают должным образом, так как если я использовал их на карте, откроется несколько модальных окон. Поэтому я пытаюсь использовать реагирующую навигацию.

ContactList.tsx:

export const ContactList: React.FunctionComponent<UserProps> = ({
  data,
  onDeleteContact,
}) => {
  const [isUserVisible, setIsUserVisible] = useState(false);
  //const [visibleUser, setVisibleUser] = useState<any>();
  const navigation = useNavigation();

  return (
    <View style={styles.users}>
      {data.users.nodes[0].userRelations.map(
        (item: { relatedUser: RelatedUser; id: number }) => {
          const numberOfFriends = item.relatedUser.userRelations.length;
          const numberPlate = 'WHV AB 123';
          return (
            <View style={styles.item} key={item.id}>
              {/* <TouchableOpacity onPress={() => setIsUserVisible(true)}> */}
              <TouchableOpacity
                onPress={() =>
                  navigation.navigate('UserDetailsScreen', {
                    firstName: item.relatedUser.firstName,
                    rating: item.relatedUser.rating,
                    numberOfFriends: numberOfFriends,
                    onDeleteContact: onDeleteContact,
                    isUserVisible: isUserVisible,
                    setIsUserVisible: setIsUserVisible,
                    numberPlate: numberPlate,
                    navigation: navigation,
                  })
                }>
                <Thumbnail
                  }}></Thumbnail>
              </TouchableOpacity>
              <View style={styles.nameNumber}>
                <Text style={styles.userName}>{userName}</Text>
              </View>
              {/* <UserDetails
                firstName={item.relatedUser.firstName}
                rating={item.relatedUser.rating}
                numberOfFriends={numberOfFriends}
                onDeleteContact={onDeleteContact}
                isUserVisible={isUserVisible}
                setIsUserVisible={setIsUserVisible}
                  numberPlate={numberPlate}>
                </UserDetails> */}
            </View>
          );
        },
      )}
    </View>
  );
};

UserDetailsScreen:

type UserProps = {
  //data: UsersQueryHookResult,
  firstName: string;
  rating: number;
  numberOfFriends: number;
  numberPlate: string;
  onDeleteContact: (id: number) => void;
  navigation: any;
};

export const UserDetailsScreen: React.FunctionComponent<UserProps> = ({
  firstName,
  rating,
  numberOfFriends,
  numberPlate,
  onDeleteContact,
  navigation,
//   isUserVisible,
//   setIsUserVisible,
}) => {
//const navigation = useNavigation();
const fName = navigation.getParam('firstName')
  return (
    // <Modal visible={isUserVisible}>
      <View style={styles.container}>
        <View>
          <TouchableOpacity
            style={styles.cross}
            //onPress={() => setIsUserVisible(false)}>
              onPress={() => navigation.navigate('Whitelist')}>
            <Thumbnail></Thumbnail>
          </TouchableOpacity>
        </View>
        <View style={styles.searchLocationContainer}>
          <UserInfoContainer
            firstName={firstName}
            rating={rating}
            numberPlate={numberPlate}
            numberOfFriends={numberOfFriends}></UserInfoContainer>
        </View>
      </View>
    // </Modal>
  );
};

Кроме того, когда я нажимаю на эскиз на этом экране, я должен go вернуться на свой предыдущий экран, так что теперь я могу щелкнуть другой объект.

На данный момент я все время получаю сообщение об ошибке navigation.getParam не определено. Как я могу это исправить?

Я считаю, что мне нужно передать route реквизиты, но я не уверен, как их использовать и следует ли передавать их на обоих экранах или на одном

Ответы [ 2 ]

1 голос
/ 20 июня 2020

Ваш метод передачи параметров в UserDetailsScreen правильный.

В предыдущей версии реакции-навигации (с 1.x по 4.x) вы можете получить параметры в "navigation.state.params".

В react-navigation 5 изменили его реализацию. Теперь вы можете получить параметры, переданные на ваш экран или компонент в объекте "route.params". Вы можете проверить код для справки ниже.

type UserProps = {
route: any,
navigation: any,
};

export const UserDetailsScreen: React.FunctionComponent<UserProps> = ({
route,navigation
}) => {
const {
    firstname,
    rating,
    numberOfFriends,
    numberPlate,
    onDeleteContact,
} = route.params;
return (
    <View style={styles.container}>
    <View>
        <TouchableOpacity
        style={styles.cross}
        //onPress={() => setIsUserVisible(false)}>
        onPress={() => navigation.navigate('Whitelist')}>
        <Thumbnail />
        </TouchableOpacity>
    </View>
    <View style={styles.searchLocationContainer}>
        <UserInfoContainer
        firstName={firstName}
        rating={rating}
        numberPlate={numberPlate}
        numberOfFriends={numberOfFriends}
        />
    </View>
    </View>
);
};
1 голос
/ 20 июня 2020

получить данные из свойств маршрута

например

type UserProps = {
  //data: UsersQueryHookResult,
  firstName: string;
  rating: number;
  numberOfFriends: number;
  numberPlate: string;
  onDeleteContact: (id: number) => void;
  navigation: any;
  route: any;
};

export const UserDetailsScreen: React.FunctionComponent<UserProps> = ({
  firstName,
  rating,
  numberOfFriends,
  numberPlate,
  onDeleteContact,
  navigation,
  route,
//   isUserVisible,
//   setIsUserVisible,
})....
route.params.firstName

, если вы можете перейти к UserDetailsScreen, вам не нужно проходить какой-либо маршрут. потому что навигация и ее свойство установлены с UserDetailsScreen

...