最近几天,我一直在努力向屏幕添加动画标题。我已成功完成此操作,但现在我想默认将其用作标题,而不是将代码复制并粘贴到我希望使用的所有屏幕中。目前,动画标头已在屏幕中实现,如下所示:
渲染标题:
static navigationOptions = ({ navigation }) => {
return {
header: () => {
return (
<SafeAreaView style={{
height: 0,
overflow: 'visible',
}}>
<Animated.View style={{height: 80, width: 80,
transform: [ {translateY: navigation.getParam('headerScrollY', 0)}]
}}>
<TouchableOpacity style={{padding: 20}} onPress={() => navigation.goBack()}>
<Icon.Ionicons style={{color: '#ffffff', width: 50, height: 50}} name={'ios-arrow-round-back'} size={50} />
</TouchableOpacity>
</Animated.View>
</SafeAreaView>
)
}
}
};
Run Code Online (Sandbox Code Playgroud)
设置状态:
constructor() {
super();
this.state = {
headerScrollY: new Animated.Value(0),
};
}
Run Code Online (Sandbox Code Playgroud)
设置动画插值并将值传递给导航道具(这是我稍后在渲染标题时将要访问的内容)
componentWillMount() {
this.props.navigation.setParams({
headerScrollY: this.state.headerScrollY.interpolate({
inputRange: [0, 80], …Run Code Online (Sandbox Code Playgroud) 捆绑失败:错误:无法react-navigation-stack从App.js以下位置解析模块:在项目中找不到 react-navigation-stack。
我尝试删除节点模块并重新安装它们,清除缓存,在新的新项目中尝试相同但没有结果
Package.json 文件
{
"name": "navigator",
"version": "0.0.1",
"private": true,
"scripts": {
"android": "react-native run-android",
"ios": "react-native run-ios",
"start": "react-native start",
"test": "jest",
"lint": "eslint ."
},
"dependencies": {
"react": "16.9.0",
"react-native": "0.61.2",
"react-native-gesture-handler": "^1.4.1",
"react-native-reanimated": "^1.3.0",
"react-native-screens": "1.0.0-alpha.23",
"react-navigation": "^4.0.10"
},
"devDependencies": {
"@babel/core": "^7.6.2",
"@babel/runtime": "^7.6.2",
"@react-native-community/eslint-config": "^0.0.5",
"babel-jest": "^24.9.0",
"eslint": "^6.5.1",
"jest": "^24.9.0",
"metro-react-native-babel-preset": "^0.56.0",
"react-test-renderer": "16.9.0"
},
"jest": {
"preset": "react-native"
}
}
Run Code Online (Sandbox Code Playgroud)
应用程序.js
import React from 'react';
import { …Run Code Online (Sandbox Code Playgroud) 我正在尝试在选项卡导航器之间传递一些参数。下面是我的程序的结构。粗体字为路线
应用程序(选项卡导航器):{主(堆栈)和过滤器(屏幕)}
主要(堆栈导航器):{ Home(屏幕)和MediaDetails(屏幕)}
我在屏幕上有一个与Filter关联的按钮,它具有onPress()函数。我传递了一些参数(但为了解决这个问题,我们只考虑参数) 。
this.props.navigation.navigate('Home', {
to: this.state.to,
}
Run Code Online (Sandbox Code Playgroud)
现在在与Home关联的屏幕中,我正在读取状态内的参数,如下所示:
state = {
to: this.props.route.params.to
}
Run Code Online (Sandbox Code Playgroud)
在App.js内部,我将to的初始值设置为“2020”,如下所示:
<Stack.Screen
name="Home"
component={HomeScreen}
initialParams={{
to: '2020'
}}
/>
Run Code Online (Sandbox Code Playgroud)
初始值确实设置为2020。我按下按钮。假设我设置为1900 。就在this.props.navigation.navigate执行之前,我console.log(this.state.to)该值,它确实更新为1900。但是,当屏幕更改为Home时,该值将恢复为2020(通过 console.log 观察到)
有人能指出这种怪异行为的原因吗?我已经尝试调试这个好几个小时了,但没有成功。React Navigation 5 也很新,所以在网上找不到类似的东西。任何帮助将不胜感激。感谢您一路以来的阅读。
编辑:问题已解决,完整代码已删除!
react-native react-navigation react-navigation-stack react-navigation-bottom-tab react-navigation-v5
我不知道是什么导致了我的 React Native 应用程序中的这个错误。我正在使用 React Navigation 库的版本 5。
有时它会随机使应用程序崩溃。谷歌搜索并没有帮助我理解这是什么。这是非常有选择性的,但这是一件好事(或坏事)。
那么这意味着什么以及可能导致它的原因是什么?
react-native react-navigation react-navigation-stack react-navigation-bottom-tab react-navigation-v5
我的 React Native 0.61.5 使用react-navigation 5.1. 这是根导航代码:
const BTab = createBottomTabNavigator();
const Stack = createStackNavigator();
export default function App() {
//const Appscreen = () => (<AppScreen data={data}/>);
return (
<NavigationContainer>
<Stack.Navigator InitialRouteName="Splash">
<Stack.Screen name="Splash" component={SplashScreen}}/>
<Stack.Screen name="App" component={AppScreen} } />
</Stack.Navigator>
</NavigationContainer>
);
}
Run Code Online (Sandbox Code Playgroud)
该组件AppScreen返回一个如下所示的堆栈:
return (
<NavigationContainer independent={true}>
<BTab.Navigator>
<BTab.Screen name="Event" component={Eventstack} />
<BTab.Screen name="Group" component={Groupstack} />
<BTab.Screen name="Contact" component={Contactstack} />
</BTab.Navigator>
</NavigationContainer>
);
Run Code Online (Sandbox Code Playgroud)
我注意到屏幕上有双标题:
如何删除App标题并只保留Group?
我的HomeHeader组件是这样的:
import React from "react";
import { View, StyleSheet, Text, Image } from "react-native";
import Icon from "react-native-vector-icons/FontAwesome5";
export default function HomeHeader({ navigation }) {
return (
<View style={styles.home_header}>
<Icon
style={styles.menu}
name="bars"
size={30}
color="white"
onPress={navigation.toggleDrawer()}
/>
<Image
style={styles.header_logo}
source={require("../assets/logo.png")}
/>
<Text>Hello</Text>
</View>
);
}
Run Code Online (Sandbox Code Playgroud)
并在我的主屏幕中使用它,如下所示:
return (
<View>
<HomeHeader navigation={navigation} />
</View>
)
Run Code Online (Sandbox Code Playgroud)
但我收到此错误消息:
警告:无法从不同组件的函数体内部更新组件。
我想要做的是,我已将 HOME 屏幕的标题部分分离到一个名为 HomeHeader 的单独组件中。在这个组件中,我附加了事件处理程序来切换 DrawerNavigation(左侧抽屉菜单)的打开/关闭
如果我在主屏幕中创建一个 Button 并添加事件处理程序来切换抽屉,它工作正常。但是只有当我从我的 HomeHeader 组件内部尝试这个问题时才会发生。
顺便说一句,我正在使用 ReactNavigation v5,我什至尝试过这种方法:https ://reactnavigation.org/docs/connecting-navigation-prop/
到目前为止没有运气。
react-native react-navigation react-navigation-drawer react-navigation-stack
此问题的用例是让抽屉菜单(如“设置”)仅在“主屏幕”中可用。在“主屏幕”上可能有许多按钮链接到堆栈导航的其他屏幕,其中抽屉不可用。
主要问题是如何仅在 Stack Navigator 的特定屏幕上启用抽屉导航?在下面的示例中,抽屉在堆栈的所有页面上都可用。我尝试过gestureEnabled但没有成功:
const StackHome = () => (
<Stack.Navigator>
<Stack.Screen name="Home" component={Home} />
<Stack.Screen name="Example1" component={Example1} />
<Stack.Screen name="Example2" component={Example2} />
</Stack.Navigator>
);
<Drawer.Navigator initialRouteName="Home">
<Drawer.Screen name="Home" component={StackHome} />
<Drawer.Screen name="Settings" component={Settings} />
</Drawer.Navigator>
Run Code Online (Sandbox Code Playgroud)
另一方面,如果我尝试将其作为屏幕Drawer之一Stack,那么我总是有相同的标题栏(例如“标题”)
react-native react-navigation react-navigation-drawer react-navigation-stack react-navigation-v5
我已经像本文档所述编写了类型定义,但是当我使用嵌套导航时出现了问题。
这里是示例代码:
在我的App.tsx
export type MainStackParamList = {
Setting: undefined
}
export type TabParamList = {
Home: undefined
Personal: undefined
}
const MainStack = createNativeStackNavigator<MainStackParamList>()
const Tab = createBottomTabNavigator<TabParamList>()
const RootStack = createNativeStackNavigator()
const MainStackScreen = () => (
<MainStack.Navigator screenOptions={{ headerShown: false }}>
<MainStack.Screen name="Setting" component={Setting} />
</MainStack.Navigator>
)
const TabScreen = () => (
<Tab.Navigator screenOptions={{ headerShown: false }}>
<Tab.Screen name="Home" component={Setting} />
<Tab.Screen name="Personal" component={Setting} />
</Tab.Navigator>
)
const RootStackScreen = () => ( …Run Code Online (Sandbox Code Playgroud) //app.js "react": "16.9.0","react-native": "0.61.5",官方按照官方文档但是显示黑屏 React Native
import React from 'react';
import { SafeAreaView, StatusBar, View, Text } from 'react-native';
import { Provider } from 'react-redux';
import configureStore from './App/redux/store/store'
import { NavigationContainer } from '@react-navigation/native';
import { createStackNavigator } from '@react-navigation/stack';
import AppSplashScreen from './App/screens/splashScreen/SplashScreen';
const Stack = createStackNavigator();
function MyStack() {
return (
<Stack.Navigator>
<Stack.Screen name="Home" component={AppSplashScreen} />
</Stack.Navigator>
);
}
export default class App extends React.Component {
constructor(props) {
super(props)
this.state = {}
}
render() {
return ( …Run Code Online (Sandbox Code Playgroud) 我想隐藏屏幕标题,但仍然在堆栈导航器中显示后退按钮?我在 Stack.Navigator 中设置了 screenOptions={{ headerShown: false }} ,它隐藏了屏幕标题和后退按钮。我想隐藏屏幕标题。
有人可以帮忙吗?下面是我的堆栈导航器:
function SearchStack() {
return (
<Stack.Navigator screenOptions={{ headerShown: false }}>
<Stack.Screen name="SearchScreen" component={SearchScreen} />
<Stack.Screen name="SearchListScreen" component={SearchListScreen} />
</Stack.Navigator>
);
}
Run Code Online (Sandbox Code Playgroud)
在选项卡导航器中,堆栈设置为:
<Tab.Navigator screenOptions={({ route }) => ({
tabBarIcon: ({ focused, color, size }) => {...})}>
<Tab.Screen name="Search" component={SearchStack} />
</Tab.Navigator>
Run Code Online (Sandbox Code Playgroud)
这就是我目前看到的:
但这就是我希望我的选项卡导航栏仍然位于搜索堆栈底部的情况:
这是我在 Stack.Navigator 中使用 options={{headerMode:"none"}} 得到的结果:
将 Stack.Navigator 更新添加到 <Stack.Navigator screenOptions={{ headerTitle:"", headerTransparent:true }}> 时,会发生以下情况。如何将后退按钮添加或移动到顶部,就像第二张图片一样,这是在不将堆栈添加到 Tab.Screen 时实现的,因此进行更改:
<Tab.Screen name="Search" component={SearchStack} />
到
<Tab.Screen name="Search" component={SearchScreen} />
但这样做会导致该选项卡不会出现在搜索列表屏幕中。