如何在 Expo 和 NativeBase 中调整状态栏

Posted

技术标签:

【中文标题】如何在 Expo 和 NativeBase 中调整状态栏【英文标题】:How to adjust for Status Bar in Expo and NativeBase 【发布时间】:2021-11-05 06:17:08 【问题描述】:

我有一个 Expo 应用程序,我在其中使用 NativeBase 库 (https://nativebase.io/)

由于某种原因,该应用未针对状态栏进行调整。 显示的小部件围绕状态栏区域进行绘制,而不是在通常情况下在状态栏下方开始绘制。

如何使用 NativeBase 库调整此 Expo 应用程序中的状态栏高度?

import  StatusBar  from 'expo-status-bar';
import React from 'react';
import  StyleSheet, View  from 'react-native';
import  NativeBaseProvider, Box, Text, VStack, HStack, Checkbox, Divider, Heading, Center, ScrollView, FlatList  from 'native-base';

export default function App() 

  var data = [
    
      id: "bd7acbea-c1b1-46c2-aed5-3ad53abb28ba",
      title: "First Item",
    ,
    
      id: "3ac68afc-c605-48d3-a4f8-fbd91aa97f63",
      title: "Second Item",
    ,
    
      id: "58694a0f-3da1-471f-bd96-145571e29d72",
      title: "Third Item",
    ,
  ]
  return (
    

    <NativeBaseProvider>
      <Center flex=1>
        <FlatList
        data=data
        renderItem=( item ) => (
          <Box px=5 py=2 rounded="md" my=2 bg="primary.300">
            item.title
          </Box>
          
        )
        keyExtractor=(item) => item.id
        />
      </Center>
    </NativeBaseProvider>
  );

【问题讨论】:

【参考方案1】:

您可以将NativeBase Provider 包装在一个视图中,并为其指定flex of 1marginTopStatusBar.currentHeight

如下图

import React from 'react';
import  StyleSheet, View, StatusBar  from 'react-native';
import 
  NativeBaseProvider,
  Box,
  Text,
  VStack,
  HStack,
  Checkbox,
  Divider,
  Heading,
  Center,
  ScrollView,
  FlatList,
 from 'native-base';

export default function App() 
  var data = [
    
      id: 'bd7acbea-c1b1-46c2-aed5-3ad53abb28ba',
      title: 'First Item',
    ,
    
      id: '3ac68afc-c605-48d3-a4f8-fbd91aa97f63',
      title: 'Second Item',
    ,
    
      id: '58694a0f-3da1-471f-bd96-145571e29d72',
      title: 'Third Item',
    ,
  ];
  return (
    <View style= flex: 1, marginTop: StatusBar.currentHeight >
      <NativeBaseProvider>
        <Center flex=1>
          <FlatList
            data=data
            renderItem=( item ) => (
              <Box px=5 py=2 rounded="md" my=2 bg="primary.300">
                item.title
              </Box>
            )
            keyExtractor=(item) => item.id
          />
        </Center>
      </NativeBaseProvider>
    </View>
  );

【讨论】:

currentHeight 常量仅在 android 中可用...对于 ios 有什么解决方法吗? reactnative.dev/docs/statusbar#currentheight-android【参考方案2】:

你看过 SafeAreaContext 组件吗? 链接:Expo SafeAreaContext

它允许您的内容不低于标准。

如果您知道它,但它不符合您的需求,您可以使用 StatusBarHeight 设置:

import  StyleSheet, View, StatusBar  from 'react-native';
    
let statusbar = StatusBar.currentHeight
    
return(<View style=marginTop: statusbar 

【讨论】:

currentHeight 常量仅在 Android 中可用...对于 ios 有什么解决方法吗? reactnative.dev/docs/statusbar#currentheight-android【参考方案3】:

使用常量.statusBarHeight 的 从'expo-constants'导入常量;

   import React from 'react';
    import  StyleSheet, View, StatusBar  from 'react-native';
    import 
      NativeBaseProvider,
      Box,
      Text,
      VStack,
      HStack,
      Checkbox,
      Divider,
      Heading,
      Center,
      ScrollView,
      FlatList,
     from 'native-base';
    
    import Constants from 'expo-constants';
    
    export default function App() 
      var data = [
        
          id: 'bd7acbea-c1b1-46c2-aed5-3ad53abb28ba',
          title: 'First Item',
        ,
        
          id: '3ac68afc-c605-48d3-a4f8-fbd91aa97f63',
          title: 'Second Item',
        ,
        
          id: '58694a0f-3da1-471f-bd96-145571e29d72',
          title: 'Third Item',
        ,
      ];
      return (
        <View style= flex: 1, marginTop: Constants.statusBarHeight >
          <NativeBaseProvider>
            <Center flex=1>
              <FlatList
                data=data
                renderItem=( item ) => (
                  <Box px=5 py=2 rounded="md" my=2 bg="primary.300">
                    item.title
                  </Box>
                )
                keyExtractor=(item) => item.id
              />
            </Center>
          </NativeBaseProvider>
        </View>
      );
    

【讨论】:

以上是关于如何在 Expo 和 NativeBase 中调整状态栏的主要内容,如果未能解决你的问题,请参考以下文章

NativeBase 内容未在 Jest 中使用 react-native-testing-library 呈现

NativeBase:如何禁用选择器?

在 NativeBase 和 Shoutem 之间,React Native 最好用哪个?

NativeBase 列表未更新

Nativebase React Native 为啥我不能在输入中传递一个数字

NativeBase准备工作