React Native Expo路由器:如何在ExpoRoot中覆盖默认SafeAreaProvider?

nukf8bse  于 2023-10-22  发布在  React
关注(0)|答案(1)|浏览(157)

使用的框架:Expo SDK版本:~49.0.13
大家好,
我在这里寻求帮助,使用新的世博会路由器v2与世博会SDK 49。正如团队在this blog post中所述,新路由器的默认布局现在使用安全区域视图。下面的ExpoRoot.txs文件使用SafeAreaProvider:

export function ExpoRoot({
  wrapper: ParentWrapper = Fragment,
  ...props
}: ExpoRootProps) {
  /*
   * Due to static rendering we need to wrap these top level views in second wrapper
   * View's like <GestureHandlerRootView /> generate a <div> so if the parent wrapper
   * is a HTML document, we need to ensure its inside the <body>
   */
  const wrapper: ExpoRootProps["wrapper"] = ({ children }) => {
    return (
      <ParentWrapper>
        <GestureHandlerRootView>
          <SafeAreaProvider
            // SSR support
            initialMetrics={INITIAL_METRICS}
          >
            {children}

            {/* Users can override this by adding another StatusBar element anywhere higher in the component tree. */}
            {!hasViewControllerBasedStatusBarAppearance && (
              <StatusBar style="auto" />
            )}
          </SafeAreaProvider>
        </GestureHandlerRootView>
      </ParentWrapper>
    );
  };

对于我的特定用例,我想避免在这里使用SafeAreaProvider,以便在屏幕上使用完整的背景颜色,并在布局中使用我自己的填充和边距。我怎样才能做到这一点,而不直接修改这个文件?
谢谢你的帮助

t5fffqht

t5fffqht1#

我觉得你已经得到你想要的了。

当使用开发人员菜单检查元素时,您可以观察应用于UI组件的边距和填充。值得注意的是,一般来说,SafeAreaProvider本身并不引入填充或边距。
但是,如果要控制安全区域插入,可以使用SafeAreaView组件和useSafeAreaInsets钩子。通过使用SafeAreaView,您可以确保正确调整应用的内容,以适应设备上的安全区域(例如,槽口和系统栏)。您可以使用useSafeAreaInsets钩子获取这些insets的特定值。
出于测试目的,您可以在应用内创建一个新堆栈,通常在根或布局级别,尤其是在使用基于选项卡的模板时。可以自定义此堆栈,以您所需的方式处理安全区域,确保您的UI组件尊重设备的安全区域,而不会影响您的设计。

首先,如果您安装了模板,请删除默认的布局 Package ,并使用以下选项创建一个新的堆栈:

<Stack.Screen name="index" options={{  headerShown: false,statusBarTranslucent:true ,statusBarHidden:false,navigationBarHidden:true, }} />

并为这个堆栈创建组件,如下所示:

import { StyleSheet, View ,Text} from 'react-native';
import { SafeAreaView, useSafeAreaInsets } from 'react-native-safe-area-context';

export default function Home() {
const insets =useSafeAreaInsets()

return (<SafeAreaView style={{
flex: 1,
alignItems: 'center',
justifyContent: 'center',
backgroundColor:"blue",
padding:0,
margin:0,
top:0, // 0-insets.top and use dimentions.screen.height for height
bottom:0,
}}><View style={styles.container} >
  <Text style={styles.title}>Screeen</Text>
  <Text>Top: {insets.top}</Text>
  <Text>Bottom: {insets.bottom}</Text>
  <Text>Left: {insets.left}</Text>
  <Text>Right: {insets.right}</Text>
</View></SafeAreaView>);
}

const styles = StyleSheet.create({
container: {
    flex: 1,
    alignItems: 'center',
    justifyContent: 'center',
    backgroundColor:"green",
    padding:0,
    margin:0,
    top:0,
    bottom:0
  }
 });`

相关问题