Mobilne Aplikacje z React
5 godz. 51 min · React Native · Full-stack i Programowanie
Piotr SzacińskiZarówno iOS jak i Android posiadają swoje natywne SDK, do obsługi którego musimy poznać nowe języki - Swift czy Kotlin, o Objective-C czy Javie nie wspominając. Z kolei React Native jest do tego świetną alternatywą, która pozwala tworzyć jeden kod na obie platformy. Dodatkowo - bazuje na najpopularniejszym frameworku webowym, co znacząco zmniejsza próg wejścia.
Tak samo jak "czysty" React, React Native opiera się na komponentach. Poznasz ich specyfikę i nauczysz się poprawnie budować UI aplikacji. Zrozumiesz też jak najwydajniej zarządzać skomplikowanym layoutem, takim jak długie listy, i jak to wszystko łatwo stylować.
Animacje to nie tylko efekty przyjemne dla oka - to przede wszystkim dobry UX, który pozwala użytkownikowi odnaleźć się w aplikacji i zrozumieć jej mechanikę. Podczas kursu poznasz wszystkie podstawowe metody i koncepcje tworzenia animacji oraz poznasz sposoby optymalizacji ich działania. Dodatkowo omówimy prawidłowe podejście do dużo bardziej skomplikowanych interaktywnych animacji, przedstawimy ciekawe biblioteki oraz best-practices.
Praktycznie każda aplikacja, niezależnie od tego, czy web, czy mobile, składa się z wielu widoków i ekranów. Zarządzanie ścieżkami, jakimi użytkownik może się poruszać, to jedna z najważniejszych rzeczy - a w tym kursie dowiesz się jakich narzędzi należy używać i jak łatwo obsługiwać zagnieżdżone ekrany.
Niewątpliwym atutem aplikacji jest to, że może praktycznie bez ograniczeń przechowywać content w urządzeniu telefonu, a przez to - dostarczać treści niezależnie od dostępności internetu. Omówimy różne koncepcje zapisywania danych oraz poznamy metody i narzędzia do ich wdrażania.
Przybliżymy ci proces wypuszczania aplikacji "w świat" oraz przedstawimy narzędzia, z których sam autor korzysta do ułatwienia tego procesu.
Kurs jest dla każdego kto zna podstawy JavaScript oraz React i chciałby się rozwijać i tworzyć mega ciekawe projekty, które mogą używać aparatu czy sensorów smartfona.
0.62.2+
W poprtzedniej lekcji zrobiliśmy sobie taką listę która działa całkiem spoko
natomiast no doszliśmy do sporego problemu którym jest no wydajność
tej listy zwłaszcza czas tworzenia tych elementów czyli jeśli klikniemy tutaj dodaj
bardziej to widać w sumie tutaj na androidzie to
widać że tu nam się wszystko w tym momencie krzaczy i nie mamy za bardzo na to wpływu i nie ma
co się dziwić bo jednak jak to jest 1000 elementów i wszystkie muszą być wrzucone do pamięci
i wszystkie muszą być wyrenderowane i na
szczęście taki problem jest jakby od początku
smartfonów to znaczy aplikacje mobilne tak naprawdę SDK powstały
z tego względu że w tamtej chwili po pierwsze prędkość internetu
nie pozwalała na to żeby cały czas wchodzić sobie na nowe strony i żeby to było szybko ładowane
a z drugiej strony moc tych telefonów nie pozwalała na ich szybkie i wydajne
renderowanie więc aplikacje od samego początku były jakby miały
na celu wydajność tak że wydajność to był punkt pierwszy a że
bardzo często dochodziło do tego musieliśmy coś wyświetlać w listach to tam te
rozwiązania były całkiem zaawansowane i
odpowiednio na iOS-ie jest taki mówię to w ramach ciekawostki bo
nie przyda nam się tu w żaden sposób w tej lekcji mieliśmy taki element jak mamy
takie elementy jaki UITableView albo UICollectionView jeśli chciałbyś sobie doczytać
to zachęcam o na androidzie mamy element wcześniej to się nazywało
ListView teraz to jest RecyclerView i te elementy działają na takiej zasadzie że mimo tego
że wyświetlają 1000 elementów na przykład tak jak tutaj są
w stanie wyświetlić 1000 elementów to nie renderują ich naraz one gdzieś tam je chowają i
tak naprawdę wyswietlają tylko te elementy które są widoczne i tak
jak większość komponentów tak jak wam pokazywałem tutaj w
layout manager na podstawie naszego kodu Reactowego jest
generowana generuje kod natywny praktycznie 1 do 1
tak niestety w przypadku tych list nie udało się tego zrobić nie
udało się tego zrobić z tego względu że nasz JS nasz React jest
jednowątkowy i nie dało się tego niestety w żaden sposób spleść
z tym z tą koncepcją wielowątkowości doładowywania w innym wątku elementów
w tych natywnych listach na szczęście jakby twórcy
React Native'a zadbali o to żebyśmy mieli przynajmniej jakiś odpowiednik tego tego
narzędzia i to narzędzie nazywa się FlatList zaimportujmy je sobie
sobie z React Native wcześniej
to się nazywało zdaje się ListView więc jeśli gdzieś zobaczycie ListView w React Native to
tak naprawdę to jest to samo z tą różnicą że ListView już w tej chwili nawet chyba jest
dostępne chyba nawet
można je zaimportować ale powinno być deprecated
dokładnie mamy deprecated raczej już tego nie powinniśmy używać ale w jakiś starych projektach
w starych bibliotekach może to jeszcze być więc to taki protip jeśli byście przeglądali jakiś kod
bioteki którą której chcielibyście użyć i zobaczylibyście tam ListView no
to znaczy że trzeba się zastanowić czy na pewno chcecie jej użyć
okej jak działa ta jak działa to FlatList przede wszystkim to skoro sobie tutaj
ładnie wszystko opakowujemy to zamiast ScrollView zrobimy sobie FlatList natomiast
FlatList nie działa tak że jest jakby kontenerem na wszystkie dzieci
bo w ten sposób i tak musielibyśmy wszystko wyrenderować FlatList jest elementem self-closing
w które musimy podać no tak naprawdę dwie rzeczy
po pierwsze musimy podać naszą listę elementów w formie data to
będą nasze taski a po drugie musimy
podać metodę renderItem w której
będziemy renderować nasz Item czyli na przykład mamy tutaj nasz nazwaliśmy
go ListItem i
on miał propsa info teraz tutaj
dostaniemy coś takiego jak item i
możemy to przekazać tasks i renderItem to
jest funkcja która jako argument przyjmuje wartości
item oraz jeszcze index które mamy i w
niej musimy zwrócić w jaki sposób ma być renderowany nasz item zobaczmy czy to działa jak
widać że nasza lista jest natomiast odświeżmy to sobie coś mi
się tutaj schrzaniło będę musiałbym zupełnie przebudować projekt ale już się nie będę w to bawić więc po prostu sobie zreloaduje
tak samo tutaj i dodajemy sobie
coś tam i popatrzcie okej trwało to sekundkę wiem no nie
sekundkę ułamek sekundy ale trwało natomiast no jest to nieporównywalnie szybsze z tym co
było w przypadku ScrollView dodajmy sobie ADD tyle tak mamy
tutaj 1000 elementów zauważcie jedną rzecz zauważcie gdzie się znajduje scroll indicator
jeśli popatrzycie sobie na poprzednią lekcję zobaczycie że on w tym momencie na pięćdziesiątym elemencie
byłby gdzieś tutaj no bo faktycznie mamy jeszcze mnóstwo rzeczy do przescrollowania
natomiast FlatLista działa trochę tak jak właśnie ta natywna lista to znaczy
ona FlatLista stara się nie randerować nie wyświetlać rzeczy których nie widzi w zwiazku z tym
jak ja sobie tutaj scrolluję to zauważcie że to jest doładowywane cały czas i to pozwala nam
na ościągnięcie dużo większego performance'u i tak naprawdę w każdej liście w której nie wiemy ile
będzie elementów ale przeczuwamy że będzie ich więcej niż 10 20 warto
zastosować FlatListę zamiast ScrollView co
jeszcze jest istotne odświeżymy sobie zauważcie że tutaj
dostajemy komunikat VirtualizedList missing keys for items make sure to specify a key id
zobaczmy sobie nasz komunikat make sure to specify
a key id properity on each item or provide a custom keyExtractor to
jest tutaj nam React Native mówi o tym że fajnie
jak byśmy dodali coś takiego jak key do naszych elementów bo on byłby w stanie lepiej zarządzać tym
który obiekt tak naprawdę jest którym i trochę trochę lepiej je
wyświetlać czemu tu jest VirtualizedList a nie FlatList ponieważ FlatList
to jest tylko jakby uproszczenie VirtualizedList jeśli chcielibyście
zrobić troszeczkę bardziej zaawansowaną listę i potrzebowalibyście trochę niżej
poziomowych elementów to moglibyście właśnie z takiej VirtualizedList
skorzystać natomiast wszystko to co ma VirtualizedList ma też FlatList tylko po prostu
pewne parametry ma już wypełnione z defaultu więc to co
co zrobić żeby troszkę to przyśpieszyć a właściwie na tę
chwilę to po prostu pozbyć się tego warningu to musimy dodać sobie dodać
sobie taką funkcję to ona przyjmuje item zdaje się że index i
musimy zwrócić na przykład index.toString to
po prostu z automatu możecie robić nie powinno okej
zobaczmy czy się pozbyliśmy komunikatu okej
tak pozbyliśmy się komunikatu jesli sobie dodamy
te elementy to zauważcie że dalej jest wszystko super i pewnie podobnie jest na androidzie
dodajmy
super jest okej jest fajnie nasza
lista już jest poprawna fajne jest to że ta lista okej
zrobiliśmy to w ten sposób i warto zwrócić uwagę na jedną rzecz tutaj nazwa
tej funkcji renderItem to znaczy to nie znaczy że nasz
element jest tutaj tworzony tak jak było w przypadku map i ScrollView tylko to znaczy że
nasz element w tym momencie jest renderowany to jest metoda która mówi i jaki sposób renderować ten item
w związku z tym on wykorzystuje ją w trakcie scrolla do renderowania
kolejnych elementów ale nie co nie znaczy że renderuje wszystkie naraz dlatego musimy
mieć tą metodę jakby wyeksportowaną tutaj jakby czemu jak to optymalizować powiemy sobie w
następnej lekcji ale jeszcze tutaj chciałem wspomnieć o paru parametrach najprostszych
propsach które mamy własnie na tej liście które mogą sprawić że
w pewnych case'ach będzie nam po prostu łatwiej z nich korzystać
lub zwiększają jej możliwości takim podstawowym bardzo prostym jest dodanie
takiej opcji inverted i to sprawia że nasza lista
jest odwrócona zauważcie że zaczynamy od ostatniego elementu tak
i scrollujemy ją w drugą stronę jak zjadę na dół to znaczy to już będziemy na elemencie
zerowym już prawie jesteśmy świetnie i teraz kiedy się to może przydać w praktyce
przydało mi się to raz w aplikacji z czatem gdzie te wiadomości szły
od góry można było je doładowywać do góry a najnowsza pojawiała się na dole
i oczywiście można byłoby to zaimplementować po prostu odwracając elementy w liście
i troszkę zmieniając właściwości scrolla ale skoro mamy to coś takiego gotowego
to też warto z tego skorzystać ale nie będziemy tego aż tutaj obracać
inną fajną rzeczą którą z której można skorzystać jest coś jak numCollumns
i to sprawia że możemy sobie w bardzo łatwy sposób zrobić
grida komunikat który tutaj się który dostaliśmy
wynika z tego że nie możemy tego parametru zmieniać w trakcie lotu bo po prostu tego nasz
fast refresh nie ogarnia więc to musimy zreload'ować i
tadam nic się nie dzieje to wynika z tego że nasz ListItem
ma width 100% więc nic
z tym nie zrobimy ale jesli na przykład byśmy dali tutaj mu width 30 pixeli
dajmy może 50 żeby nie było aż tak źle to zauważcie
że mamy naszego grida tak mamy nasze elementy obok siebie możemy dodać mu na przykład
margin-right 5 pixeli
i fajnie mamy coś takiego jeśli chcielibyśmy powiedzmy zrobić
żeby to było bardziej dynamiczne to możemy tak usunąć tutaj naszego widtha usunąć
ten margines w tej chwili elementy będą
po prostu się dopasowywały do szerokość tekstu do długość tekstu
i możemy sobie skorzystać z Dimensions co to jest
Dimensions już o tym mówię Dimensions o to jest taki moduł
który pozwala na wyciągać tak kilka informacji o systemie jednym z nich
jest właśnie get window możemy sobie wyciągnąć rozmiar naszego
okna to nam zwróci rozmiar okna naszego roboczego
czyli właściwie smartfona jeśli na przykład tak zgodnie ze szkołą chcielibyśmy poznać
szerokość na przykład Headera no to mamy taką metodę jak onLayout
zdaje się i w tej metodzie dostaniemy to jest funkcja która będzie wywołana
w momencie kiedy ten Layout się zmieni i teoretycznie wypadałoby z niej korzystać
ale na poczet tej lekcji pójdziemy na łatwiznę i zrobimy sobie coś takiego i
zrobimy sobie tak zrobimy sobie taką const tutaj numCollumns
to się równa 3 const itemWidth
to się równa width przez numCollumns okej
i popatrzmy zrobimy sobie to tak i
tutaj na siłę przekażemy
width to sie równa width chyba tak to nazwałem czyli ten width i ten width
to nazwałem no właśnie okej
ale jeszcze sobie przekażmy te style żeby on nie wiedział jak ma tutaj wyświetlać że
ma korzystać też ze stylów przekazanych okej no dobra
teraz to sprawdźmy no
niestety ListItem ach
oczywiście był tu błąd okej i widzicie teraz
nam się itemy ładnie tutaj dopasowały są równej szerokości jeśli zmienimy sobie w tej chwili o
na przykład na 4 kolumny to oczywiście
nie może być robione w locie to widzicie że musimy
to odświeżyć aha no tak po
prostu 4 kolumny a trzy elementy więc dajmy na szybko last
okej i teraz mamy tak i się nam te elementy dopasowują jeśli
dodam ten miliard elementów czy tam z 1000 zauważcie że też nam się to zrobi tak
i mamy takiego grida po kolei 78 89 90 91 i fajnie
i to też się może kiedyś przydać jak .................. troche krótsza
spoko natomiast tutaj teraz nam się to za bardzo nie przyda myślę
że możemy sobie to też usunąć i wrócić do tego co było wcześniej czyli raz dwa trzy
tasks currentText żebyśmy mogli dodawać
z tego nie będziemy korzystać sobie to usuniemy
to też sobie usuniemy ListItem
to sobie też usuniemy nie będzie nam to potrzebne już zobaczmy
czy to nam działa działa okej ostatnią
rzeczą którą chciałem pokazać na liście na naszej FlatList'cie to są to jest
Header i Footer czyli możemy sobie w łatwy sposób ListHeader
Component i
na przykład zróbmy sobie tutaj Text Header
i odpowiednio Footer
zobaczmy jak to będzie wyglądało no
i mamy tak jakby to są elementy które będą się trzymać czyli ten Header który mamy tutaj chcemy
żeby zawsze był przypięty więc jest po prostu nad tą listą ale jeśli chcielibyśmy mieć na przykład przypięty
do jako element zerowy i element n plus 1 no
to możemy sobie użyć tych dwóch komponentów i to wyglada całkiem spoko i generalnie
jeśli chodzi o tą listę to tyle ona zawiera dużo więcej parametrów
ale o tym sobie trochę opowiemy też w następnej lekcji