我正在try 从标题按钮打开模式视图.我正在使用REACTIVATION V6(https://reactnavigation.org/docs/modal/)作为指南.

我得到的一个似乎无法解决的错误是: ERROR TypeError: Cannot read property 'navigate' of undefined, js engine: hermes

这是我的密码.有人能帮我解决问题吗?

import Reactfrom 'react';
import { NavigationContainer } from '@react-navigation/native';
import { createBottomTabNavigator } from '@react-navigation/bottom-tabs';
import { Button, Modal, StyleSheet, Text, View} from 'react-native';

// Import Tab Screens
import ScreenA from './src/pages/screenA'
import ScreenB from './src/pages/screenB'
import ScreenC from './src/pages/screenC'

const Tab = createBottomTabNavigator();

function ScreenModal({ navigation }) {
  return (
    <View>
      <Text>This is a modal!</Text>
      <Button onPress={() => navigation.goBack()} title="Dismiss" />
    </View>
  );
}

export default function App({ navigation }) {

  return (
    <NavigationContainer>
      <Tab.Navigator>
      <Tab.Group>
        <Tab.Screen name="ScreenA" component={ScreenA} />
      </Tab.Group>
      <Tab.Group>
        <Tab.Screen name="ScreenB" component={ScreenB} 
            options={{
              headerRight: () => (
                <Button
                  onPress={() => navigation.navigate('ScreenModal')}
                  title="Open Modal"
                />
              ),
            }}
          />
        </Tab.Group>
      <Tab.Group>
        <Tab.Screen name="ScreenC" component={ScreenC} />
      </Tab.Group>
      </Tab.Navigator>
    </NavigationContainer>
  );
}

推荐答案

因为"ScreenModal"不是"NavigationContainer"中的屏幕,所以它不会收到"导航"props .您可以使用"use导航"挂钩来访问它.

const navigation = useNavigation()

但这不会工作无论如何,因为ScreenModal不是一个屏幕,所以它不能导航到任何地方,除非你有定义它的其他地方.

另外,REACTION Native有一个您可能想要使用的modal组件.您可以这样实现它:

import { Modal } from 'react-native'

const Tab = createBottomTabNavigator();

export default function App() {
  const [showModal, setShowModal] = React.useState()

  return (
    <NavigationContainer>
      <Modal visible={showModal}>
        <View>
          <Text>This is a modal!</Text>
          <Button onPress={() => setShowModal(false)} title="Dismiss" />
        </View>
      </Modal>


      <Tab.Navigator>
      <Tab.Group>
        <Tab.Screen name="ScreenA" component={ScreenA} />
      </Tab.Group>
      <Tab.Group>
        <Tab.Screen name="ScreenB" component={ScreenB} 
            options={{
              headerRight: () => (
                <Button
                  onPress={() => setShowModal(true)}
                  title="Open Modal"
                />
              ),
            }}
          />
        </Tab.Group>
      <Tab.Group>
        <Tab.Screen name="ScreenC" component={ScreenC} />
      </Tab.Group>
      </Tab.Navigator>
    </NavigationContainer>
  );
}

由于Modals会在任何你想添加的组件的顶部呈现,所以它不需要在根组件中.但是,如果你想让ScreenModal成为一个屏幕,那么你需要让它成为堆栈导航器中的一个屏幕.

const Tab = createBottomTabNavigator();
const Stack = createStackNavigator(); //install and import this

function ScreenModal({ navigation }) {
  return (
    <View>
      <Text>This is a modal!</Text>
      <Button onPress={() => navigation.goBack()} title="Dismiss" />
    </View>
  );
}

const HomeNavigator = ({ navigation }) =>{
  return(
    <Tab.Navigator>
      <Tab.Group>
        <Tab.Screen name="ScreenA" component={ScreenA} />
      </Tab.Group>
      <Tab.Group>
        <Tab.Screen name="ScreenB" component={ScreenB}
          options={{
            headerRight: () => (
              <Button
                onPress={() => navigation.navigate('ScreenModal')}
                title="Open Modal"
              />
            ),
          }}
        />
      </Tab.Group>
      <Tab.Group>
        <Tab.Screen name="ScreenC" component={ScreenC} />
      </Tab.Group>
    </Tab.Navigator>
  )
}

export default function App() {

  return (
    <NavigationContainer>
      <Stack.Navigator>
        <Stack.Screen name="Home" component={HomeNavigator}/>
        <Stack.Screen name="ScreenModal" component={ScreenModal} options={{presentation:'modal'}}/>
      </Stack.Navigator>
    </NavigationContainer>
  );
}

希望这能有所帮助

React-native相关问答推荐

如何更改分隔底部标签和屏幕内容的线的 colored颜色 ?React Native Tab导航器

AxiosError:Reaction Native EXPO开发版本中的网络错误

React Native 中的视图与 Flex 不占用相同的高度空间

React Native 在每个页面加载时调用数据库

警告:API 'variant.getMergeAssets()' 已过时 / Android Studio 3.3

React Native:约束 Animated.Value

什么时候适合在 React 中使用构造函数?

react native foreach 循环

如何以编程方式在 react-native 中截屏

如何在 React Native 中获取 TextInput 相对于其父级或屏幕的光标位置

ReactNative FlatList 一次渲染所有元素?

试图注册两个同名的视图 RNGestureHandlerButton

No such property: ABI for class: org.gradle.api.tasks.OutputFile

是否可以使用react-native 创建 Android Wear 应用程序

Fragment片段内的react-native

动态改变 React Native Flat List 中的列数

如何在 React Native 的 MapView 中设置标记

Node.js 在 React-Native 中的作用是什么?

React Native:使用选项卡动画收缩标题

Expo在使用Windows 10的android模拟器上运行