ukryj menu
SPEC
aktualizacja: 2021-11-23 10:57:07
1. instalacja aplikacji i modułów
zainstaluj nową aplikację expo (expo init) uruchom blank
aby dało się stworzyć aplikacje wieloekranową, do takiego typu aplikacji trzeba doinstalować nawigację react-navigation
dokumentacja
https://reactnavigation.org/kopiuj
UWAGA: poniższe moduły zainstaluj po kolei w folderze aplikacji, za pomocą CMD:
npm install @react-navigation/nativekopiuj
..\expo install react-native-screens react-native-safe-area-contextkopiuj
npm install @react-navigation/bottom-tabskopiuj
2. testowa aplikacja z użyciem nawigacji typu Tab
w pliku App.js wstaw tylko:
import * as React from 'react';
import { NavigationContainer } from '@react-navigation/native';
import { createBottomTabNavigator } from '@react-navigation/bottom-tabs';
import Screen1 from "./components/Screen1"
import Screen2 from "./components/Screen2"
const Tab = createBottomTabNavigator();
function App() {
return (
<NavigationContainer>
<Tab.Navigator>
<Tab.Screen name="s1" component={Screen1} />
<Tab.Screen name="s2" component={Screen2} />
</Tab.Navigator>
</NavigationContainer>
);
}
export default App;kopiuj
import { NavigationContainer } from '@react-navigation/native';
import { createBottomTabNavigator } from '@react-navigation/bottom-tabs';
import Screen1 from "./components/Screen1"
import Screen2 from "./components/Screen2"
const Tab = createBottomTabNavigator();
function App() {
return (
<NavigationContainer>
<Tab.Navigator>
<Tab.Screen name="s1" component={Screen1} />
<Tab.Screen name="s2" component={Screen2} />
</Tab.Navigator>
</NavigationContainer>
);
}
export default App;kopiuj
3. opcje wyglądu ekranu
wszystko ustalamy w pliku App dla danego ekranu
możemy pokazać lub ukryć header, zmienić jego kolorystykę
<Tab.Screen
name="s1"
component={Screen1}
options={{
title: 'title',
headerStyle: {
backgroundColor: '#ff0000',
},
headerTintColor: '#ffffff',
headerTitleStyle: {
fontWeight: 'bold',
},
}} />kopiuj
więcej w dokumentacji, np ukrycie headera
options={{
...
headerShown: false
...
}}
kopiujpokazanie image u w tab-sach:
import Img from "./components/test.png"kopiuj
w Tab.Screen
options={{
...
tabBarIcon: () => (
<Image source={Img } />
)
...
}}kopiuj
4. FlatList - lista
przykład
<FlatList
data={
[
{ key: 'a' },
{ key: 'b' },
{ key: 'c' },
]
}
renderItem={({ item }) => <Text>{item.key}</Text>}
/>kopiuj
dokumentacja
https://reactnative.dev/docs/flatlistkopiuj
Uwaga: w projekcie item powinien być skonstruowany w osobnym pliku / klasie
problem z key: wstaw do FlatList
keyExtractor={item => item.id.toString()}kopiuj
5. Device - informacje o urządzeniu
przykład
<FlatList
data={
[
{ key: 'a' },
{ key: 'b' },
{ key: 'c' },
]
}
renderItem={({ item }) => <Text>{item.key}</Text>}
/>kopiuj
dokumentacja
https://reactnative.dev/docs/flatlistkopiuj
Uwaga: w projekcie item powinien być skonstruowany w osobnym pliku / klasie
problem z key: wstaw do FlatList
keyExtractor={item => item.id.toString()}kopiuj
5. Device - informacje o urządzeniu
w folderze aplikacji instalujemy
..\expo install expo-devicekopiuj
otrzymujemy zestaw informacji o urządzeniu
import * as Device from 'expo-device';kopiuj
informacje wykorzystane w aplikacji:
console.log(Device)kopiuj
Device.brand
Device.deviceName
Device.manufacturer
Device.modelName
Device.getDeviceTypeAsync()
Device.getMaxMemoryAsync()
Device.osName
Device.osVersion
Device.platformApiLevel
Device.totalMemorykopiuj
Device.deviceName
Device.manufacturer
Device.modelName
Device.getDeviceTypeAsync()
Device.getMaxMemoryAsync()
Device.osName
Device.osVersion
Device.platformApiLevel
Device.totalMemorykopiuj
patrz dokumentacja
https://docs.expo.dev/versions/latest/sdk/device/
6. MyButton - prop types - właściwości wymagane w klasie
można zaprojektować klasę tak, aby tworząc jej obiekt, należało podać konkretne props-y ,
bez ich podania będzie błąd
klasa
import PropTypes from 'prop-types';
class AnyClass extends Component{
...
}
AnyClass.propTypes = {
testProp1: PropTypes.string.isRequired,
testProp2: PropTypes.bool.isRequired,
testPress: PropTypes.func.isRequired,
};
export default AnyClasskopiuj
utworzenie obiektu klasy
<AnyClass testProp1="" testProp2={false} testPress={()=>this.anyFunction()} /> kopiuj
Uwaga: powyższy schemat pracy zastosujemy w projekcie do utworzenia klasy MyButton
Uwaga2 - raz przygotowany komponent będzie używany w przyszłych projektach
Uwaga3 - komponent tworzymy z TouchableOpacity i Text, a nie z dostarczanej z RN klasy Button
7. opis aplikacji
- podział na komponenty (patrz skriny):
HomeScreen - ekran startowy
DeviceScreen - ekran z listą parametrów urządzenia, użycie FlatList
MyButton - własna klasa button-a, użycie proptypes
ListItem - element listy, w osobnym pliku
- używamy nawigacji createBottomTabNavigator
- można zobaczyć listę wyżej wymienionych (punkt 5) parametrów urządzenia
- można usunąć parametr z listy (ekran pokazuje bieżącą listę)
- można przywrócić wszystkie parametry (refresh)
- używamy własnej klasy MyButton, a nie natywnej Button
- używamy własnej klasy MyButton, a nie natywnej Button