React Native 标题/底部标签栏在第一个应用程序加载时跳跃

Posted

技术标签:

【中文标题】React Native 标题/底部标签栏在第一个应用程序加载时跳跃【英文标题】:React Native header / bottom tabbar jumping on first app load 【发布时间】:2020-10-23 23:49:45 【问题描述】:

我有一个仅包含导航包的应用程序。在 ios 上,一切都很好,但在 android 上,标题和/或底部标签栏似乎在跳跃(可能重新计算它们的位置)。仅当我使用导航组件并且仅当应用程序刚刚启动时才会发生这种情况。有没有人遇到同样的问题?

提前致谢。


包:

"@react-native-community/masked-view": "^0.1.10",
"@react-navigation/bottom-tabs": "^5.6.1",
"@react-navigation/native": "^5.6.1",
"@react-navigation/stack": "^5.6.2",
"react": "16.11.0",
"react-native": "0.62.2",
"react-native-gesture-handler": "^1.6.1",
"react-native-reanimated": "^1.9.0",
"react-native-safe-area-context": "^3.0.7",
"react-native-screens": "^2.9.0"

这是整个应用程序:

import * as React from 'react';
import  Button, Text, View  from 'react-native';
import  NavigationContainer  from '@react-navigation/native';
import  createStackNavigator  from '@react-navigation/stack';
import  createBottomTabNavigator  from '@react-navigation/bottom-tabs';

function DetailsScreen() 
    return (
        <View style= flex: 1, justifyContent: 'center', alignItems: 'center' >
            <Text>Details!</Text>
        </View>
    );


function HomeScreen( navigation ) 
    return (
        <View style= flex: 1, justifyContent: 'center', alignItems: 'center' >
            <Text>Home screen</Text>
            <Button
                title="Go to Details"
                onPress=() => navigation.navigate('Details')
            />
        </View>
    );


function SettingsScreen( navigation ) 
    return (
        <View style= flex: 1, justifyContent: 'center', alignItems: 'center' >
            <Text>Settings screen</Text>
            <Button
                title="Go to Details"
                onPress=() => navigation.navigate('Details')
            />
        </View>
    );


const HomeStack = createStackNavigator();

function HomeStackScreen() 
    return (
        <HomeStack.Navigator>
            <HomeStack.Screen name="Home" component=HomeScreen />
            <HomeStack.Screen name="Details" component=DetailsScreen />
        </HomeStack.Navigator>
    );


const SettingsStack = createStackNavigator();

function SettingsStackScreen() 
    return (
        <SettingsStack.Navigator>
            <SettingsStack.Screen name="Settings" component=SettingsScreen />
            <SettingsStack.Screen name="Details" component=DetailsScreen />
        </SettingsStack.Navigator>
    );


const Tab = createBottomTabNavigator();

export default function App() 
    return (
        <NavigationContainer>
            <Tab.Navigator>
                <Tab.Screen name="Home" component=HomeStackScreen />
                <Tab.Screen name="Settings" component=SettingsStackScreen />
            </Tab.Navigator>
        </NavigationContainer>
    );

【问题讨论】:

你好@Basar Sen,你能用 RN 0.61.5 版本试试吗?它不应该那样跳跃。另外,请在真机上试用。 @FreakyCoder 谢谢。我试过你的建议。但它仍然是一样的。这是一个奇怪的错误:) 让我测试一下:) @FreakyCoder 我试过这个组合。现在它可以正常工作了:)。 “react”:“16.11.0”,“react-native”:“0.62.2”,“@react-navigation/bottom-tabs”:“^5.2.5”,“@react-navigation/native”:“ ^5.1.4", "@react-navigation/stack": "^5.2.9", "@react-native-community/masked-view": "^0.1.7", "react-native-gesture-handler ": "^1.6.1", "react-native-reanimated": "^1.7.1", "react-native-screens": "^2.4.0", "react-native-safe-area-context" : "^0.7.3" 我遇到了同样的问题 "@react-navigation/bottom-tabs": "^5.5.1", 【参考方案1】:

我使用SafeAreaProvider 解决了这个问题。您应该在应用根组件中添加SafeAreaProvider,并使用SafeAreaView 作为页面的根组件。还要检查 SafeAreaView 的导入语句,react-native 也有 SafeAreaView 但该组件仅支持 iOS 10+。

【讨论】:

我还需要重置 safeAreaInsets。参考我更新的答案:***.com/a/67922977/492325【参考方案2】:

我为这个确切的错误苦苦挣扎了一段时间。我终于能够找到解决方法。

似乎所有 ReactNavigation 导航器(例如 Tab 和 Stack)默认情况下都会容纳安全区域。此页面中提到了这一点:https://reactnavigation.org/docs/bottom-tab-navigator/

默认情况下会自动检测设备的安全区域插入

所以我们看到的行为似乎是由于这个原因。目前尚不清楚为什么 ReactNavigation 有错误的“安全区域”逻辑,但解决方法是禁用它。

解决方法类似于@Arun Girivasan 的建议,但有几个额外步骤:

    使用react-native-safe-area-context 将所有内容包装在SafeAreaProviderSafeAreaView 中 将所有方向的 safeAreaInsets 指定为 0:
<Tab.Navigator
  initialRouteName="AppDashboard"
  tabBarOptions=
    safeAreaInsets: 
      top: 0,
      bottom: 0,
      left: 0,
      right: 0,
    
  
>
    如果您在标签屏幕中创建堆栈,请为堆栈导航器提供相同的safeAreaInsets

通过这些更改,我不再看到标签栏高度跳跃并且我不再看到堆栈标题跳跃。基本上,这种解决方法为我解决了所有 UI 故障。

【讨论】:

刚刚为我节省了很多时间来解决这个问题......【参考方案3】:

我在@react-navigation/bottom-tabs 上也发生了同样的事情,我刚刚从“tabstyle”中删除了 paddingBottom 和 padding top 并粘贴到“style”中,这解决了问题

之前:

  tabBarOptions=
    keyboardHidesTabBar: true,
    activeTintColor: COLOR.white,

    style: 
      backgroundColor: COLOR.primary,
      height: responsiveHeight(7),
    ,
    tabStyle: 
      paddingBottom: responsiveHeight(0.5),
      paddingTop: responsiveHeight(0.5),
    ,
  

之后:

  tabBarOptions=
    keyboardHidesTabBar: true,
    activeTintColor: COLOR.white,
    style: 
      backgroundColor: COLOR.primary,
      height: responsiveHeight(7),
      paddingBottom: responsiveHeight(0.5),
      paddingTop: responsiveHeight(0.5),
    ,
  
  
...

希望对你有帮助:)

【讨论】:

【参考方案4】:

给这个

navigationOptions: 
        headerShown: true,
        safeAreaInsets: 
          top: 0,
          bottom: 0,
          left: 0,
          right: 0,
        ,
      ,

如果你使用的是 react-navigation 4x

【讨论】:

以上是关于React Native 标题/底部标签栏在第一个应用程序加载时跳跃的主要内容,如果未能解决你的问题,请参考以下文章

react-native-navigation 底部标签样式

React-Native-Navigation (WIX):如何更新底部标签的徽章计数?

尝试在 react-native 的底部选项卡导航上添加图像时面临问题

在 react native 中添加抽屉菜单和底部标签栏的事件处理程序

如何在 React Native 中隐藏底部操作栏

在 React native 中创建自定义底部选项卡导航器