#react-native #react-navigation #stack-navigator
#react-native #реагировать-навигация #стек-навигатор
Вопрос:
Я хочу перейти к другим экранам, когда пользователь нажимает на элемент flatlist, но продолжает получать ту же ошибку.
TypeError: undefined is not an object (evaluating 'navigation.navigate')
Я создал проект на snack.expo, чтобы попробовать перемещаться между экранами, и он работает. Вот ссылка https://snack.expo.io/ad5yaIPIo
Но всякий раз, когда я пытался реализовать свой проект, я получаю ту же ошибку. Нужна помощь.
AuditList.js // Child Component
const AuditList = ({navigation}) => {
const [selectedId, setSelectedId] = useState(null);
const ItemRender = ({item}) => {
const backgroundColor =
item.id === selectedId ? 'rgba(0, 0, 0, 0.2)' : 'rgba(255, 255, 255, 1)';
return (
<AuditItem
item={item}
onPress={() => {
setSelectedId(item.id);
navigation.navigate('Audit Details'); // Here's the navigation to go to another screens
}}
style={{backgroundColor}}
/>
);
};
return (
<AuditContainer>
<FlatList
data={DataList}
renderItem={ItemRender}
keyExtractor={(item) => item.id}
extraData={selectedId}
/>
</AuditContainer>
);
};
SiteAudit.js // Parent Component
const InProgress = () => {
return <AuditList />;
};
const Completed = () => {
return <AuditList />;
};
const SiteAudit = () => {
return (
<Tab.Screen name="In Progress" component={InProgress} />
<Tab.Screen name="Completed" component={Completed} />
)
}
StackNavigation.js // Navigate To Another Screens
const StackNavigation = ({navigation}) => {
return (
<NavigationContainer>
<Stack.Navigator initialRouteName="Site Audit">
<Stack.Screen name="Site Audit" component={SiteAudit} />
<Stack.Screen
name="Audit Details"
component={AuditDetails}
options={{
headerLeft: () => (
<LeftNavigationButton navigationProps={navigation} />
),
headerTitle: (props) => <HeaderLogo {...props} />,
headerStyle: {
height: 150,
backgroundColor: '#212529',
borderBottomLeftRadius: 10,
borderBottomRightRadius: 10,
shadowColor: '#212529',
shadowOffset: {
width: 0,
height: 2,
},
shadowOpacity: 0.7,
shadowRadius: 3.84,
elevation: 5,
alignSelf: 'center',
},
}}
/>
</Stack.Navigator>
</NavigationContainer>
);
};
Редактировать
Routes.js // Main Navigation
const Routes = () => {
return (
<NavigationContainer theme={RootTheme}>
{user ? (
<>
<DrawerNavigation />
</>
) : (
<>
<AuthStack />
</>
)}
</NavigationContainer>
)
}
Как я мог бы вызвать AuditDetails
в моей основной навигации? Давайте предположим, что my StackNavigation.js
— это навигация для AuditDetails
Комментарии:
1. Где вы визуализируете
AuditList
?
Ответ №1:
Поскольку ваша AuditList
навигационная система не отображается непосредственно в виде экрана (( InProgress
компонент делает))… navigation
объект не вводится автоматически. в ваш компонент prop
Так что вы либо
- используйте
useNavigation
перехват.import { useNavigation } from '@react-navigation/native'; const navigation = useNavigation();
или
- передайте
navigation
объект вашемуAuditList
компоненту.
Редактировать
const InProgress = ({ navigation }) => {
return <AuditList navigation={navigation} />;
};
Редактировать 2
В вашем имени есть пробел… удалите его, потому что это имя маршрута, которое должно использоваться для навигации
<Stack.Screen
name="Audit Details" // <-- here
Такая же проблема существует и на других маршрутах
Комментарии:
1. Мой
AuditList
компонент отображается на родительском компоненте, который я здесь не предоставил. Родительский компонент в моем случае специально предназначен только для визуализации<Tab.Screen>
компонента. Я использую этоconst Tab = createMaterialTopTabNavigator();
2. Не могли бы вы отредактировать свой вопрос с помощью TabNavigator?
3. Я получаю еще одну ошибку в полезной нагрузке. К вашему сведению, я уже создал экран страницы для
Audit Details
. ОшибкаThe action 'NAVIGATE' with payload {"name":"AuditDetails"} was not handled by any navigator. Do you have a screen named 'AuditDetails'?
4. Сэр, я думаю, что приведенный мной код немного сбивает с толку. См. Отредактированный вопрос.
5. Спасибо, сэр, я понял это относительно навигации. Спасибо за вашу помощь!