Expo React Native StatusBar скрыт, но все еще показывает пробелыAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Expo React Native StatusBar скрыт, но все еще показывает пробелы

Сообщение Anonymous »

Я почти уверен, что это мой первый вопрос, который я публикую здесь, поэтому надеюсь, что сделаю это правильно и предоставлю всю необходимую информацию.
Контекст: h3>
Это двойной личный проект. Я создаю это приложение исключительно для себя и своего партнера, поэтому никаких серьезных ограничений нет, и я открыт для всех предложений и рекомендаций. Мы с ней часто путешествуем и говорим на нескольких иностранных языках, но мы оба по-прежнему учимся больше каждый день и хотим иметь персонализированное приложение, которым мы могли бы пользоваться и делиться вместе, поэтому я начал создавать это приложение для наших навыков общения и развития языковых навыков.< /p>
Этот проект также предоставляет мне прекрасную возможность изучить и развить свои навыки работы с React Native и нативной разработкой на Kotlin/Swift (некоторое время я пробовал JavaFx, но у меня полный опыт разработки). -time интерфейсный веб-разработчик, поэтому React Native кажется гораздо более естественным подходом для разработки пользовательского интерфейса, а Kotlin/Swift — для нативной и серверной части).
По сути, это просто учебное приложение, сочетающее в себе функции Мне нравятся Quizlet, Anki, Pimsleur и т. д., а также объединение некоторых функций чата, среди прочего, но это выходит за рамки данной проблемы. Пожалуйста, ознакомьтесь с моей формулировкой основной проблемы.
Постановка проблемы:
У меня все еще возникает проблема с панелью состояния в верхней части экрана. оставляя пустое пространство после его скрытия. Эта проблема сохраняется, несмотря на все, что я уже пробовал и исследовал.
Цель:
Я хочу, чтобы на этом дисплее отображался тот цвет фона, который мне нужен. когда StatusBar скрыт, или ImageBackground в зависимости от того, на каком действии/экране он находится. т. е. в верхней части экрана нет пустого пространства или выреза.
Что я уже пробовал:
  • Я я уже попробовал фоновый цвет как прозрачный и установил для свойства translucent значение true.
  • В app.json я пытался настроить его на использование темного цвета для свойства userInterfaceStyle.
  • Я пробовал использовать пакет response-native-safe-area-context с их SafeAreaProvider для всего приложения и использовал SafeAreaView вокруг самого компонента (я знаю, что обычный SafeAreaView предназначен только для iOS, а мне он нужен специально для Android, я просто подумал, возможно, стоит попробовать этот контекстный пакет).
  • Установите для фона черный цвет
  • Установите стиль на темный, а для barStyle – на темный контент
    < li>Я пробовал использовать expo-status-bar и response-native StatusBar (как ни странно, хотя я использую expo, у меня было еще больше проблем со стилем expo-status-bar )
У меня заканчиваются идеи, которые стоит попробовать.. Ничто из вышеперечисленного ничего не дало при реализации. Как только я скрываю строку состояния, вверху всегда остается пустое пространство, и это меня очень раздражает.
Код:

app.json< /h4>
[code]{
"expo": {
"name": "...",
"slug": "...",
"version": "1.0.0",
"orientation": "portrait",
"icon": "./assets/icon.png",
"userInterfaceStyle": "dark",
"splash": {
"image": "./assets/....gif",
"resizeMode": "contain",
"backgroundColor": "#000000"
},
"assetBundlePatterns": [
"**/*"
],
"ios": {
"supportsTablet": true,
"bundleIdentifier": "com...."
},
"android": {
"package": "com....",
"adaptiveIcon": {
"foregroundImage": "./assets/....gif",
"backgroundColor": "#000000"
}
},
"androidStatusBar": {
"barStyle": "dark-content",
"backgroundColor": "#000000",
"hidden": true,
"translucent": true
},
"web": {
"favicon": "./assets/favicon.png"
}
}
}
[/code]
Flashcards.js

Код: Выделить всё

import { useState, useEffect } from 'react';
import { View, Text, Pressable, StyleSheet, FlatList, Dimensions, ImageBackground, StatusBar } from 'react-native';
import { SafeAreaView } from 'react-native-safe-area-context';
import Logo from '../assets/....gif';

const DEVICE_WIDTH = Dimensions.get('window').width;

const SAMPLE = [
{
id: 0,
name: "Русские карточки",
description: "These are sample Russian flashcards.",
},
{
id: 1,
name: "Flashcards tiếng Việt",
description: "These are sample Vietnamese flashcards.",
},
{
id: 2,
name: '中文抽認卡',
description: 'These are sample Chinese flashcards.',
},
{
id: 3,
name: 'כרטיסי פלאש בעברית',
description: 'These are sample Hebrew flashcards.',
},
{
id: 4,
name: 'Data structures',
description: 'These are sample data structure flashcards.',
},
{
id: 5,
name: 'Countries',
description: 'These are sample culture flashcards from countries around the world.',
},
{
id: 6,
name: 'Cultures',
description: 'These are sample cultural tradition flashcards.',
},
{
id: 7,
name: 'Exercises',
description: 'These are sample flashcards about healthy exercises.',
},
{
id: 8,
name: 'Final',
description: 'This is the final collection just being used to see if it will make it scrollable.',
}
];

export default function Flashcards({ navigation }) {
const [collections, setCollections] = useState([]);
const [selectedCollection, setSelectedCollection] = useState(null);

useEffect(() => {
setCollections(SAMPLE)
}, [])

const Item = ({ name, onPress, description }) => (

{name}
{description}

);

const handleClick = (item) => {
setSelectedCollection(item.id);
navigation.navigate('StudyMode', {
name: item.name,
});
};

return (




Flashcards


 {
return   handleClick(item)} name={item.name} description={item.description} />
}}
keyExtractor={item => item.id}
/>



)
}

const styles = StyleSheet.create({
container: {
flex: 1,
flexDirection: 'column',
marginTop: StatusBar.currentHeight + 10 || 10,
backgroundColor: '#000000',
alignItems: 'center',
justifyContent: 'center',
paddingBottom: 60,
},
image: {
flex: 1,
justifyContent: 'center',
contentFit: 'cover',
},
titleContainer: {
borderBottomWidth: 6,
borderColor: 'red',
borderRadius: 12,
backgroundColor: 'black',
justifyContent: 'center',
alignItems: 'center',
marginLeft: 12,
marginRight: 12,
marginTop: 14,
marginBottom: 10,
},
title: {
color: 'white',
fontFamily: 'Agright',
fontSize: 32,
},
collectionsContainer: {
borderWidth: 6,
borderColor: 'red',
borderRadius: 12,
backgroundColor: 'black',
width: DEVICE_WIDTH - 10,
},
flatlist: {
flexGrow: 0,
height: '100%',
},
item: {
borderRadius: 12,
borderWidth: 2,
borderColor: 'red',
width: '99%',
alignItems: 'center',
marginLeft: 2,
marginRight: 2,
marginTop: 6,
marginBottom: 6,
paddingVertical: 6,
backgroundColor: '#000000',
},
itemTitle: {
fontFamily: 'Agright',
fontSize: 26,
color: 'white',
},
itemDescription: {
fontFamily: 'Agright',
fontSize: 13,
color: 'white',
}
});

App.js

Код: Выделить всё

import { useState, useEffect, useContext } from 'react';
import { NavigationContainer } from '@react-navigation/native';
import { createNativeStackNavigator } from '@react-navigation/native-stack';
import { SafeAreaProvider } from 'react-native-safe-area-context';
import * as SplashScreen from 'expo-splash-screen';
import * as Font from 'expo-font';
import { Platform, NativeModules } from 'react-native';
import { IntlProvider } from 'react-intl';
import en from './locales/en.json';
import he from './locales/he.json';
import ru from './locales/ru.json';
import uk from './locales/uk.json';
import vi from './locales/vi.json';
import zh from './locales/zh.json';

/**
* Components
*/
import Login from './screens/Login';
import Home from './screens/Home';
import Flashcards from './screens/Flashcards';
import StudyMode from './screens/StudyMode';
import Texts from './screens/Texts';
import Translator from './screens/Translator';
import Dictionary from './screens/Dictionary';
import Chat from './screens/Chat';

/**
* Hooks
*/
import useFonts from './hooks/useFonts';

/**
* Context
*/
import { LocaleContextProvider, LocaleContext } from './context/LocaleContext';
import { DbContextProvider } from './database/DbContext';

/**
* Messages (Localization)
*/
const messages = {
'en': en,
'en_US': en,
'he': he,
'ru': ru,
'uk': uk,
'vi': vi,
'zh': zh,
};
const devicePlatform = Platform.OS;
const _deviceLocale = devicePlatform === 'android' ?
NativeModules.I18nManager.localeIdentifier :
NativeModules.SettingsManager.settings.AppleLocale ||
NativeModules.SettingsManager.settings.AppleLanguages[0];
const deviceLocale = _deviceLocale.split(/[-_]/)[0];

SplashScreen.preventAutoHideAsync();

const Stack = createNativeStackNavigator();
const screenOptions = {
headerStyle: {
backgroundColor: '#000000',
},
headerTintColor: '#ffffff',
headerTitleStyle: {
fontFamily: 'Agright',
textAlign: 'center'
},
headerTitleAlign: 'center',
};

export default function App() {
const [appIsReady, setAppIsReady] = useState(false);
const [isAuthNd, setIsAuthNd] = useState(false);
const [isVisible, setIsVisible] = useState(false);
const [fontsLoaded] = Font.useFonts({
Agright: require('./assets/fonts/AgrightRegular-qZ5dr.otf'),
})

const { changeLanguage, currentLang } = useContext(LocaleContext);

const loadFonts = async () =>  {
try {
await Font.loadAsync({
Agright: require('./assets/fonts/AgrightRegular-qZ5dr.otf'),
Fridays: require('./assets/fonts/Fridays-AWjM.ttf'),
MyChemicalRomance: require('./assets/fonts/MyChemicalRomance-1X5Z.ttf'),
Toxia: require('./assets/fonts/Toxia-OwOA.ttf'),
Varukers: require('./assets/fonts/VarukersPersonalUse-K70Be.ttf'),
});
} catch (err) {
console.error(err, err.stack);
} finally {
setAppIsReady(true);
}
};

const loadHomeScreen = async () => {
if (appIsReady) {
await SplashScreen.hideAsync();
}
};

useEffect(() => {
if (fontsLoaded) {
setAppIsReady(true);
}
}, [fontsLoaded]);

useEffect(() =>  {
if (appIsReady) {
loadHomeScreen();
}
}, [appIsReady])

if (!fontsLoaded) {
return null;
}

return (






{!isAuthNd
? (

)
: (

)
}













);
}
Использование

Код: Выделить всё

  "dependencies": {
"@react-navigation/native": "^6.1.6",
"@react-navigation/native-stack": "^6.9.12",
"@react-oauth/google": "^0.11.0",
"axios": "^1.4.0",
"expo": "~48.0.15",
"expo-application": "~5.1.1",
"expo-asset": "~8.9.1",
"expo-auth-session": "~4.0.3",
"expo-crypto": "~12.2.1",
"expo-file-system": "~15.2.2",
"expo-font": "^11.1.1",
"expo-image": "~1.0.1",
"expo-splash-screen": "~0.18.2",
"expo-sqlite": "~11.1.1",
"expo-web-browser": "~12.1.1",
"isaac": "^0.0.5",
"react": "18.2.0",
"react-intl": "^6.4.4",
"react-native": "0.71.8",
"react-native-bcrypt": "^2.4.0",
"react-native-crypto":  "^2.2.0",
"react-native-safe-area-context": "4.5.0",
"uuid": "^9.0.0",
"expo-system-ui": "~2.2.1"
},
"devDependencies": {
"@babel/core": "^7.20.0"
},
Большое спасибо за помощь!


Подробнее здесь: https://stackoverflow.com/questions/765 ... whitespace
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»