Fermer

octobre 1, 2019

Cloner Tinder à l'aide de React Native Elements et de Expo –


Il est difficile de disposer de dispositions de pixels parfaites sur un mobile. Même si React Native facilite la tâche par rapport à ses homologues natifs, il faut encore beaucoup de travail pour obtenir une application mobile à la perfection.

Dans ce tutoriel, nous allons cloner la plus célèbre application de rencontres, Tinder. Nous découvrirons ensuite un framework d'interface utilisateur appelé React Native Elements qui facilite le style des applications React Native.

Comme il ne s'agit que d'un didacticiel de mise en page, nous allons utiliser Expo, car cela rend les choses beaucoup plus faciles à mettre en place que le vieux un peu vieux [Native-Cli. Nous utiliserons également beaucoup de données factices pour créer notre application

Nous créerons quatre écrans en tout … Accueil Coups de cœur Profil et Messages .

Voulez-vous apprendre Réagissez Autochtone de la base? Cet article est un extrait de notre bibliothèque Premium. Obtenez une collection complète de livres natifs de React couvrant les bases, les projets, les astuces, les outils, etc., avec SitePoint Premium. Inscrivez-vous maintenant pour seulement 9 $ / mois .

Prérequis

Pour ce tutoriel, vous devez posséder des connaissances de base de Réagir Native et avoir une connaissance suffisante de de Expo . . Vous aurez également besoin du client Expo installé sur votre appareil mobile ou d'un simulateur compatible installé sur votre ordinateur. Vous trouverez des instructions sur la procédure à suivre ici ici .

Vous devez également posséder une connaissance de base des styles de dans React Native. Les styles dans React Native sont fondamentalement une abstraction similaire à celle de CSS, avec seulement quelques différences. Vous pouvez obtenir une liste de toutes les propriétés dans la feuille de feuille de style .

Tout au long de ce didacticiel, nous utiliserons le fil . Si vous n'avez pas le fil déjà installé, installez-le à partir de ici .

Assurez-vous également que vous avez déjà installé expo-cli sur votre ordinateur. .

S'il n'est pas déjà installé, installez-le:

 $ yarn global add expo-cli

Pour vous assurer que nous sommes sur la même page, voici les versions utilisées dans ce tutoriel:

  • Noeud 11.14.0
  • npm 6.4.1
  • fil 1.15.2
  • expo 2.16. 1

Assurez-vous de mettre à jour expo-cli si vous ne l'avez pas mise à jour depuis un moment, car les versions de expo sont rapidement obsolètes.

Nous allons construisez quelque chose qui ressemble à ceci:

 Démonstration de Tinder à l'Expo

Si vous voulez simplement cloner le repo, le code complet se trouve sur GitHub .

Pour commencer

Mettons en place un nouveau projet d’exposition utilisant expo-cli :

 $ expo init expo-tinder

Il vous sera ensuite demandé de choisir un modèle. Vous devez choisir tabs et appuyer sur . Entrez .

 Expo Init - Choisissez un modèle

Ensuite, il vous sera demandé de nommer le projet. Tapez de l'expo et tapez . Entrez à nouveau .

 Expo Init - Nommez le projet

Enfin, il vous sera demandé de presser y pour installer des dépendances avec le fil ou n pour installer des dépendances avec npm . Appuyez sur et .

 Expo Init - Installez les dépendances

Cette application permet de créer une nouvelle application React Native utilisant expo-cli .

Réagissez Native Elements

React Native Elements est une boîte à outils d'interface utilisateur multiplate-forme pour React Native avec une conception cohérente pour Android, iOS et le Web.

Il est facile à utiliser et entièrement construit avec JavaScript. C'est également le tout premier kit d'interface utilisateur conçu pour React Native.

Il nous permet de personnaliser entièrement les styles de chacun de nos composants, de manière à ce que chaque application ait son propre aspect et sa propre sensation.

open source et soutenu par une communauté de développeurs impressionnants .

Vous pouvez créer facilement de belles applications.

 Réagissez avec une démonstration d'éléments natifs

Cloning Tinder UI

We 'a déjà créé un projet nommé expo-tinder .

Pour exécuter le projet, tapez ceci:

 $ yarn start

Appuyez sur i pour exécuter le simulateur iOS. Ceci fera automatiquement fonctionner le simulateur iOS même s’il n’est pas ouvert.

Appuyez sur a pour exécuter l’émulateur Android. Notez que l'émulateur doit déjà être installé et démarré avant de taper a . Sinon, une erreur se produira dans le terminal.

Il devrait ressembler à ceci:

 App Expo Tabs

La configuration initiale a déjà été installée react-navigation pour nous. La navigation par les onglets du bas fonctionne également par défaut car nous avons choisi les onglets dans la deuxième étape de expo init . Vous pouvez le vérifier en appuyant sur Liens et Paramètres .

Le dossier écrans / est responsable du contenu affiché lorsque les onglets sont modifiés.

] Maintenant, supprimez complètement le contenu de HomeScreen.js et remplacez-le par le texte suivant:

 import Réaction de 'react'
importer {Text, View} de 'react-native'

classe HomeScreen étend React.Component {
  render () {
    revenir (
      
         Écran d'accueil 
      
    )
  }
}

export par défaut HomeScreen

Vous devriez voir la nouvelle interface maintenant:

 L’écran d’accueil vide

Nous allons maintenant adapter les onglets à l’application que nous allons créer. Pour notre clone Tinder, nous allons avoir quatre écrans: Accueil Coups de cœur Profil et Messages . [19659003] Nous pouvons supprimer complètement LinksScreen.js et SettingsScreen.js du dossier screens / . Notez que notre application se casse, avec un écran rouge plein d’erreurs.

En effet, nous y sommes liés dans le dossier de navigation / . Ouvrez MainTabNavigator.js dans le dossier de navigation / . Il ressemble actuellement à ceci:

 import Réagissez à partir de 'réagit';
importer {Platform} de 'react-native';
import {createStackNavigator, createBottomTabNavigator} de 'react-navigation';

importer TabBarIcon de '../components/TabBarIcon';
importer HomeScreen de '../screens/HomeScreen';
importer LinksScreen de '../screens/LinksScreen';
importer SettingsScreen de '../screens/SettingsScreen';

const HomeStack = createStackNavigator ({
  Accueil: HomeScreen,
});

HomeStack.navigationOptions = {
  tabBarLabel: 'Home',
  tabBarIcon: ({focus}) => (
    
  ),
};

const LinksStack = createStackNavigator ({
  Liens: LinksScreen,
});

LinksStack.navigationOptions = {
  tabBarLabel: 'Liens',
  tabBarIcon: ({focus}) => (
    
  ),
};

const SettingsStack = createStackNavigator ({
  Paramètres: Paramètres Écran,
});

SettingsStack.navigationOptions = {
  tabBarLabel: 'Paramètres',
  tabBarIcon: ({focus}) => (
    
  ),
};

export par défaut createBottomTabNavigator ({
  HomeStack,
  LinksStack,
  ParamètresStack,
});

Supprimer complètement les références à LinksStack et SettingsStack car nous n’avons pas besoin de ces écrans dans notre application. Cela devrait ressembler à ceci:

 import Réagissez à partir de 'réagit'
importer {Platform} de 'react-native'
importer {
  createBottomTabNavigator,
  createStackNavigator,
} de 'réagir-navigation'
importer TabBarIcon de '../components/TabBarIcon'
importer HomeScreen de '../screens/HomeScreen'

const HomeStack = createStackNavigator ({
  Accueil: HomeScreen,
})

HomeStack.navigationOptions = {
  tabBarLabel: 'Home',
  tabBarIcon: ({focus}) => (
    
  ),
}

export par défaut createBottomTabNavigator ({
  HomeStack,
})

Allez-y et créez TopPicksScreen.js ProfileScreen.js et MessagesScreen.js dans le dossier d'écrans / .

. ] Ajoutez ce qui suit dans TopPicksScreen.js :

 import Réagissez à partir de 'réagir'
importer {Text, View} de 'react-native'

La classe TopPicksScreen étend React.Component {
  render () {
    revenir (
      
         Écran Meilleurs choix 
      
    )
  }
}

exporter par défaut TopPicksScreen

Ajouter ce qui suit dans ProfileScreen.js :

 import Réagissez à partir de 'réagir'
importer {Text, View} de 'react-native'

la classe ProfileScreen étend React.Component {
  render () {
    revenir (
      
         Écran de profil 
      
    )
  }
}

exporter ProfileScreen par défaut

Ajouter ce qui suit dans MessagesScreen.js :

 import Réagissez à partir de 'réagir'
importer {Text, View} de 'react-native'

La classe MessagesScreen étend React.Component {
  render () {
    revenir (
      
         Écran Messages 
      
    )
  }
}

exporter par défaut MessagesScreen

Continuons et changeons de composants / TabBarIcon.js car nous aurons besoin d’icônes personnalisées dans la navigation de l’onglet inférieur. Il ressemble actuellement à ceci:

 import Réagissez à partir de 'réagit';
importer {Icon} de 'expo';

importer des couleurs à partir de '../constants/Colors';

La classe d'exportation TabBarIcon par défaut s'étend à React.Component {
  render () {
    revenir (
      
    )
  }
}

La seule chose que nous faisons ici est d’ajouter un accessoire Icon afin d’avoir différents types de Icon au lieu de seulement Ionicons . Actuellement, les différents types pris en charge sont AntDesign Entypo EvilIcons Feather FontAwesome . FontAwesome5 FontAwesome5Brands Fondation Ionicons MatérielCommunauté Octicons et Zocial .

Vous pouvez choisir différentes icônes dans le répertoire @ expo / vector-icons . Il ajoute une couche de compatibilité autour de @ oblador / react-native-vector-icons pour fonctionner avec le système d'actifs de l'Expo.

TabBarIcon.js devrait maintenant ressembler à ceci:

 ] import Réagir de 'réagir'
importer des couleurs depuis '../constants/Colors'

La classe d'exportation TabBarIcon par défaut s'étend à React.Component {
  render () {
    const {Icône, nom, ciblé} = this.props
    revenir (
      
    )
  }
}

Nous pouvons maintenant passer le composant Icon au composant TabBarIcon ci-dessus pour charger différentes icônes.

Nous devons modifier la mise en œuvre de HomeStack dans. le dossier MainTabNavigator.js à incorporer dans le nouveau élément TabBarIcon du composant du composant modifié:

 import {Icon} de 'expo'

const HomeStack = createStackNavigator ({
  Accueil: HomeScreen,
})

HomeStack.navigationOptions = {
  tabBarLabel: 'Home',
  tabBarIcon: ({focus}) => (
    
  ),
}

Le seul changement ici est l'ajout de Icon = {Icon.MaterialCommunityIcons} car nous avons modifié l'implémentation de TabBarIcon pour accepter le code source afin de pouvoir utiliser différents types de icônes de différents fournisseurs.

Maintenant, ces icônes doivent être chargées en premier. Sinon, nous verrons un écran vide avant que les icônes ne s'affichent. Pour cela, nous devons changer App.js en ajoutant ce qui suit:

 Font.loadAsync ({
  // Ceci est la police que nous utilisons pour notre barre d'onglets
  ... Icon.MaterialIcons.font,
  ... Icon.MaterialCommunityIcons.font,
  ... Icon.FontAwesome.font,
  ... Icon.Feather.font,
}),

Ces types de police sont utilisés à certains moments dans notre application. C’est pourquoi nous n’avons inclus que quatre polices. Par exemple, MaterialCommunityIcons est utilisé dans la variable HomeStack dans le MainTabNavigator.js comme indiqué ci-dessus.

Nous allons également masquer notre StatusBar dans App.js avec ceci:

 

Nous remplacerons également les actifs utilisés dans App.js :

 Asset.loadAsync ([
  require('./assets/images/splash.png'),
  require('./assets/images/icon.png'),
]),

Le fichier App.js devrait maintenant ressembler à ceci:

 import {AppLoading, Asset, Font, Icon} de 'expo'
importer Réagir de 'réagir'
importer {StatusBar, StyleSheet, View} de 'react-native'
importer AppNavigator à partir de './navigation/AppNavigator'

exporter la classe par défaut App étend React.Component {
  state = {
    isLoadingComplete: false,
  }

  render () {
    if (! this.state.isLoadingComplete &&! this.props.skipLoadingScreen) {
      revenir (
        
      )
    } autre {
      revenir (
        
          
      
    }
  }

  _loadResourcesAsync = async () => {
    retour Promise.all ([
      Asset.loadAsync([
        require('./assets/images/splash.png'),
        require('./assets/images/icon.png'),
      ]),
      Font.loadAsync ({
        // Ceci est la police que nous utilisons pour notre barre d'onglets
        ... Icon.MaterialIcons.font,
        ... Icon.MaterialCommunityIcons.font,
        ... Icon.FontAwesome.font,
        ... Icon.Feather.font,
      }),
    ])
  }

  _handleLoadingError = error => {
    // Dans ce cas, vous pouvez signaler l'erreur à votre erreur.
    // service de génération de rapports, tel que Sentry
    console.warn (erreur)
  }

  _handleFinishLoading = () => {
    this.setState ({isLoadingComplete: true})
  }
}

const styles = StyleSheet.create ({
  récipient: {
    flex: 1,
    backgroundColor: '#fff',
  },
})

Nous devons également relier tous les écrans ci-dessus - TopPicksScreen.js ProfileScreen.js et MessagesScreen.js —inférieur écrans / in MainTabNavigator.js dans le dossier navigation / comme indiqué dans l'organigramme suivant:

 Organigramme démo affiché dans l'organigramme suivant:

Ajoutez également le code suivant: dans MainTabNavigator.js :

 importez MessagesScreen de '../screens/MessagesScreen'
importer ProfileScreen de '../screens/ProfileScreen'
importer TopPicksScreen de '../screens/TopPicksScreen'

const TopPicksStack = createStackNavigator ({
  TopPicks: TopPicksScreen,
})

TopPicksStack.navigationOptions = {
  tabBarLabel: 'TopPicks',
  tabBarIcon: ({focus}) => (
    
  ),
}

const MessagesStack = createStackNavigator ({
  Messages: MessagesScreen,
})

MessagesStack.navigationOptions = {
  tabBarLabel: 'Messages',
  tabBarIcon: ({focus}) => (
    
  ),
}

const ProfileStack = createStackNavigator ({
  Profil: ProfileScreen,
})

ProfileStack.navigationOptions = {
  tabBarLabel: 'Profil',
  tabBarIcon: ({focus}) => (
    
  ),
}

Le code ci-dessus crée trois navigateurs de pile - TopPicksStack MessagesStack et ProfileStack . La propriété statique navigationOptions nous permet d'ajouter notre propre étiquette et notre icône à l'onglet inférieur.

De plus, changez createBottomTabNavigator pour vous assurer de TopPicksStack . MessagesStack et ProfileStack apparaissent dans l'onglet de navigation inférieur:

 export par défaut createBottomTabNavigator ({
  HomeStack,
  TopPicksStack,
  MessagesStack,
  ProfileStack,
})

Maintenant, vous devriez pouvoir voir différentes icônes dans la navigation de l'onglet inférieur avec différents écrans, comme suit:

 Différentes icônes de la navigation dans l'onglet inférieur

Nous devons maintenant supprimer le en-tête qui apparaît sur chaque écran, occupant un espace supérieur. Pour s'en débarrasser, nous devons ajouter headerMode: 'none' dans la createStackNavigator de la configuration

à ajouter dans HomeStack TopPicksStack MessagesStack et ProfileStack .

HomeStack devrait ressembler à ceci:

.
  {
    Accueil: HomeScreen,
  },
  {
    headerMode: 'aucun',
  },
)

Faites de même pour le reste d'entre eux. Maintenant, si vous vérifiez, le texte monte en haut à gauche, juste au-dessus de l’horloge.

 Différentes icônes dans la navigation de l’onglet inférieur

Il existe une solution simple à cela. Nous devons utiliser SafeAreaView . SafeAreaView restitue le contenu dans les limites de la zone de sécurité d'un périphérique. Lançons dans le répertoire écrans / et changez HomeScreen.js pour utiliser SafeAreaView de sorte qu’il ressemble à ceci:

 import Réagissez à partir de "réagissez"
importer {SafeAreaView, Text} de 'react-native'

classe HomeScreen étend React.Component {
  render () {
    revenir (
      
         Écran d'accueil 
      
    )
  }
}

export par défaut HomeScreen

Il restitue maintenant le contenu à l'intérieur des limites de l'appareil.

 SafeAreaView ajouté à l'application

Allez-y et changez le reste pour qu'il en fasse de même.

C'est répétitif pour encapsuler SafeAreaView dans chaque composant au lieu de le configurer sur un composant racine tel que App.js . Mais sachez que cela ne fonctionnera pas si vous essayez de le faire sur App.js .

N'oubliez pas que SafeAreaView doit toujours être configuré sur les composants d'écran ou leur contenu. , et ne pas envelopper des navigateurs entiers. Vous pouvez en savoir plus sur cet article de blog .

Écrans

Maintenant que notre navigation est prise en charge, nous pouvons commencer à travailler sur la présentation.

Nous allons être en utilisant un kit d’interface utilisateur appelé React Native Elements, alors installez-le:

 $ yarn add rea-native-elements

Avant de commencer, assurez-vous de copier le répertoire assets / du GitHub repo entièrement pour les images factices.

Nous allons maintenant commencer à travailler sur l'écran d'accueil.

Écran d'accueil

Avant de commencer à travailler sur HomeScreen.js supprimons les fichiers inutiles. Allez dans le dossier components / et supprimez le StyledText.js et le __ tests __ .

Commençons par travailler sur notre écran d'accueil.

Tout d'abord. , créez Card.js dans le dossier composants / . Nous allons afficher une carte de profil avec le nom de la personne, son âge et sa distance.

Nous allons utiliser un composant Tile de react-native-elements pour afficher notre carte d'utilisateur.

Le composant Tile de react-native-elements ressemble à ceci:

 Le composant de dalle de react-native- éléments

 import Réagissez à partir de 'réagir'
importer {Platform, StyleSheet} de 'react-native'
importer {Tile} de 'react-native-elements'
importer une mise en page à partir de '../constants/Layout'

const BOTTOM_BAR_HEIGHT =! Platform.isPad? 29: 49 // trouvé à partir de https://stackoverflow.com/a/50318831/6141587

export const Carte = ({image, titre, légende}) => (
  
)

const styles = StyleSheet.create ({
  récipient: {
    flex: 1,
    alignItems: 'center',
  },
  imageContainer: {
    width: Layout.window.width - 30,
    height: Layout.window.height - BOTTOM_BAR_HEIGHT * 6,
    borderRadius: 20,
    débordement: 'hidden', // cela fait de la magie
  },
  Titre: {
    position: 'absolu',
    à gauche: 10
    en bas: 30
  },
  légende: {
    position: 'absolu',
    à gauche: 10
    en bas: 10
  },
})

Le composant Card prend la pic titre et légende qui sont à leur tour transmis au carreau . Composant de .

Le composant Tile a quelques propriétés supplémentaires. activeOpacity est un nombre passé pour contrôler l'opacité lorsque vous appuyez sur la mosaïque. Cette valeur est facultative, mais la valeur par défaut est 0,2, ce qui la rend transparente sur la presse. Nous passons donc une valeur proche de 1 pour qu'elle reste opaque. . L'appui présenté change l'apparence de Tile . Il conserve le texte dans le titre et une légende du accessoire sur l'image plutôt qu'en dessous lorsque présenté n'est pas spécifié ou est défini sur false . .

Les autres sont des styles appliqués pour obtenir une carte d'utilisateur correcte. Le style conteneur centre la carte utilisateur. imageContainer a une largeur et une hauteur. La largeur est définie sur la largeur totale du périphérique - 30dp (pixels du périphérique) - et la hauteur est définie sur la hauteur totale du périphérique - BOTTOM_BAR_HEIGHT * 6 .

Nous obtenons le BOTTOM_BAR_HEIGHT du stackoverflow.com .

Nous obtenons la largeur du périphérique à partir du fichier constants / Layout.js qui contient essentiellement les éléments suivants:

 import {Dimensions} de 'react-native'

const width = Dimensions.get ('window'). width
const height = Dimensions.get ('window'). height

défaut d'exportation {
  fenêtre: {
    largeur,
    la taille,
  },
  isSmallDevice: width <375,
}

Ensuite, nous ajoutons un rayon de bordure à l'image. Mais le rayon de la frontière ne sera pas appliqué. Nous avons également besoin de overflow: hidden pour que cela fonctionne.

Ensuite, nous positionnons nos titres et de position à utiliser et [faites-lesapparaîtredanslecoininférieurgauchejusteau-dessusdel'image

Créez ensuite un fichier utils / shuffleArray.js et collez-y le fichier suivant:

 // trouvé à l'adresse https: //stackoverflow.com/a/46545530/6141587
const shuffleArray = array =>
  tableau
    .map (a => ({sort: Math.random (), valeur: a}))
    .sort ((a, b) => a.sort - b.sort)
    .map (a => a.value)

exportation par défaut shuffleArray

Ceci s'assure que notre tableau est randomisé à chaque fois.

Créez maintenant un fichier constantes / Pics.js et collez-le comme suit:

 import shuffleArray à partir de '../utils/shuffleArray '

export const HomeScreenPics = shuffleArray ([
  {
    pic: require('../assets/images/women/women1.jpg'),
    title: 'Amelia, 27',
    caption: '16 miles away',
  },
  {
    pic: require('../assets/images/women/women2.jpg'),
    title: 'Joanna, 19',
    caption: '2 miles away',
  },
  {
    pic: require('../assets/images/women/women3.jpg'),
    title: 'Charlie, 32',
    caption: '24 miles away',
  },
  {
    pic: require('../assets/images/women/women4.jpg'),
    title: 'Mary, 23',
    caption: '45 miles away',
  },
  {
    pic: require('../assets/images/women/women5.jpg'),
    title: 'Lucy, 27',
    caption: '32 miles away',
  },
  {
    pic: require('../assets/images/women/women6.jpg'),
    title: 'Rachel, 29',
    caption: '30 miles away',
  },
  {
    pic: require('../assets/images/women/women7.jpg'),
    title: 'Ava, 31',
    caption: '14 miles away',
  },
  {
    pic: require('../assets/images/women/women8.jpg'),
    title: 'Monica, 35',
    caption: '19 miles away',
  },
  {
    pic: require('../assets/images/women/women9.jpg'),
    title: 'Lisa, 25',
    caption: '7 miles away',
  },
  {
    pic: require('../assets/images/women/women10.jpg'),
    title: 'Julia, 22',
    caption: '9 miles away',
  },
  {
    pic: require('../assets/images/men/men1.jpg'),
    title: 'Aaron, 24',
    caption: '3 miles away',
  },
  {
    pic: require('../assets/images/men/men2.jpg'),
    title: 'Novak, 27',
    caption: '12 miles away',
  },
  {
    pic: require('../assets/images/men/men3.jpg'),
    title: 'Justin, 32',
    caption: '20 miles away',
  },
  {
    pic: require('../assets/images/men/men4.jpg'),
    title: 'Tony, 21',
    caption: '4 miles away',
  },
  {
    pic: require('../assets/images/men/men5.jpg'),
    title: 'Leo, 30',
    caption: '22 miles away',
  },
  {
    pic: require('../assets/images/men/men6.jpg'),
    title: 'Ronald, 39',
    caption: '35 miles away',
  },
  {
    pic: require('../assets/images/men/men7.jpg'),
    title: 'Johnny, 41',
    caption: '44 miles away',
  },
  {
    pic: require('../assets/images/men/men8.jpg'),
    title: 'Chandler, 35',
    caption: '29 miles away',
  },
  {
    pic: require('../assets/images/men/men9.jpg'),
    title: 'Joey, 29',
    caption: '17 miles away',
  },
  {
    pic: require('../assets/images/men/men10.jpg'),
    title: 'Alfie, 37',
    caption: '27 miles away',
  },
])

Il contient toutes les images nécessaires à notre application. Remarquez chaque fois que nous appelons shuffleArray pour randomiser notre tableau.

Laissons l’installation réagir pour que nos cartes soient balayées comme Tinder. La dernière version (v1.6.7 au moment de la rédaction) utilise réagit-native-view-overflow qui ne prend pas en charge Expo. Nous allons donc installer la v1.5.25:

 $ yarn add react-native-deck-swiper@1.5.25

Maintenant, allez dans le fichier HomeScreen.js et collez ce qui suit:

 import Réagissez à partir de 'react'
importer {SafeAreaView, StyleSheet} de 'react-native'
importer Swiper de 'react-native-deck-swiper'
importer {Carte} de '../components/Card'
importer {HomeScreenPics} de '../constants/Pics'

classe HomeScreen étend React.Component {
  render () {
    revenir (
      
        
      
    )
  }
}

const styles = StyleSheet.create ({
  récipient: {
    flex: 1,
    backgroundColor: 'transparent',
  },
})

export par défaut HomeScreen

Maintenant, nos cartes sont échangeables, et notre écran d'accueil ressemble à ceci:

 Démonstration de l'écran d'accueil

Essayez de glisser à présent, et cela devrait fonctionner comme suit:

Si vous le souhaitez Pour savoir comment créer ce genre d'animations Tinder Swipe, vous devriez jeter un coup d'œil à la série Tinders Swipe de Varun Nath sur YouTube.

Maintenant que notre écran d'accueil est terminé, construisons l’écran Top Picks.

Écran Top Picks

À présent, concevons l’écran Top Picks.

Commençons par constants / Pics.js et ajoutons le bit suivant à la fin: [19659051] export const TopPicksScreenPics = shuffleArray ([
{
pic: require('../assets/images/women/women11.jpg'),
title: 'Annie, 40',
caption: '26h left',
},
{
pic: require('../assets/images/women/women12.jpg'),
title: 'Lena, 31',
caption: '20h left',
},
{
pic: require('../assets/images/women/women13.jpg'),
title: 'Kendra, 19',
caption: '15h left',
},
{
pic: require('../assets/images/women/women14.jpg'),
title: 'Mia, 23',
caption: '45h left',
},
{
pic: require('../assets/images/women/women15.jpg'),
title: 'Jenny, 27',
caption: '12h left',
},
{
pic: require('../assets/images/men/men11.jpg'),
title: 'Dwayne, 34',
caption: '13h left',
},
{
pic: require('../assets/images/men/men12.jpg'),
title: 'Novak, 27',
caption: '22h left',
},
{
pic: require('../assets/images/men/men13.jpg'),
title: 'Zikomo, 32',
caption: '20h left',
},
{
pic: require('../assets/images/men/men14.jpg'),
title: 'Sam, 19',
caption: '42h left',
},
{
pic: require('../assets/images/men/men15.jpg'),
title: 'Richard, 31',
caption: '21h left',
},
])

Voici les images dont nous aurons besoin dans l’écran Choix principaux.

Maintenant, ajoutez le code suivant dans TopPicksScreen.js :

 import Réagissez à partir de 'react'
importer {ScrollView, StyleSheet, View} de 'react-native'
importer {Text, Tile} de 'react-native-elements'
importer {SafeAreaView} de 'react-navigation'
importer {TopPicksScreenPics} de '../constants/Pics'

La classe TopPicksScreen étend React.Component {
  render () {
    revenir (
      
        
          
             Meilleurs choix
          
          
             Profils en vedette du jour, choisis juste pour vous
          
          
             {TopPicksScreenPics.map (({image, titre, légende}, i) => (
              
            ))}
          
        
      
    )
  }
}

const styles = StyleSheet.create ({
  h2Style: {
    fontWeight: 'gras',
    textAlign: 'center',
    couleur: '# 000000',
  },
  h4Style: {
    textAlign: 'center',
    couleur: '# 757575',
  },
  la grille: {
    marginTop: 20,
    marginBottom: 20,
  },
  Titre: {
    position: 'absolu',
    à gauche: 10
    en bas: 50
    backgroundColor: 'noir',
    marginBottom: -2,
    rembourrage: 10
  },
  légende: {
    position: 'absolu',
    à gauche: 10
    en bas: 0,
    backgroundColor: 'noir',
    marginTop: 10,
    rembourrage: 10
  },
})

exporter par défaut TopPicksScreen

Dans un premier temps, nous utilisons le composant de base Text trouvé dans avec éléments et sous-titres.

Nous parcourons ensuite toutes les images ajoutées. dans constantes / Pics.js et affichez-les à l'aide des composants Tile .

Le titre est placé dans . ] center par défaut, mais nous les avons déplacés vers le bas à gauche avec la position : 'absolute' .

Ceci conclut notre écran Top Picks, qui était très simple.

Il ressemble à ceci:

 Démonstration de l’écran des meilleurs choix

Écran Messages

Commençons par l’écran Messages. Premièrement, nous avons besoin de données factices à afficher sur les listicles.

Créez Messages.js dans le dossier constantes / et collez-le comme suit:

 import shuffleArray from ' ../utils/shuffleArray '

export const Messages = shuffleArray ([
  {
    pic: require('../assets/images/women/women1.jpg'),
    title: 'Amelia, 27',
    message: "Let's get to your favorite restaurant.",
  },
  {
    pic: require('../assets/images/women/women2.jpg'),
    title: 'Joanna, 19',
    message: "What's the best way to win you over?",
  },
  {
    pic: require('../assets/images/men/men2.jpg'),
    title: 'Novak, 27',
    message: 'Will catch up with you later.',
  },
  {
    pic: require('../assets/images/men/men3.jpg'),
    title: 'Justin, 32',
    message: 'Probably not going to work out :(',
  },
  {
    pic: require('../assets/images/women/women3.jpg'),
    title: 'Charlie, 32',
    message: 'How about we go for a coffee on Sunday?',
  },

  {
    pic: require('../assets/images/women/women5.jpg'),
    title: 'Lucy, 27',
    message: 'Sleeping for now.',
  },
  {
    pic: require('../assets/images/men/men1.jpg'),
    title: 'Aaron, 24',
    message: 'See you soon.',
  },
  {
    pic: require('../assets/images/men/men4.jpg'),
    title: 'Tony, 21',
    message: 'Seriously, come on time.',
  },
  {
    pic: require('../assets/images/men/men5.jpg'),
    title: 'Leo, 30',
    message: "What'd you like?",
  },
  {
    pic: require('../assets/images/women/women4.jpg'),
    title: 'Mary, 23',
    message: "Hey, what's up?",
  },
  {
    pic: require('../assets/images/women/women14.jpg'),
    title: 'Michelle, 45',
    message: 'Howdy!!!',
  },
  {
    pic: require('../assets/images/women/women12.jpg'),
    title: 'Arya, 18',
    message: 'Not today!',
  },
])

Ensuite, créez MessagesScreen.js dans le dossier composants / et collez-le comme suit:

 import Réagissez à partir de 'react'
importer {SafeAreaView, ScrollView, StyleSheet} à partir de 'react-native'
importer {ListItem} de 'react-native-elements'
importer {Messages} de '../constants/Messages'

La classe MessagesScreen étend React.Component {
  render () {
    revenir (
      
        
           {Messages.map ((user, i) => (
            
          ))}
        
      
    )
  }
}

const styles = StyleSheet.create ({
  Titre: {
    fontSize: 24,
    couleur: '# 3F3F3F',
  },
  Sous-titre: {
    couleur: '# A5A5A5',
  },
})

exporter par défaut MessagesScreen

Nous prenons les données factices Messages nous les cartographions et les plaçons dans un ListItem exporté à partir de react-native-elements . Le composant ListItem affiche une liste d'éléments l'un après l'autre, comme nous le voyons sur toutes les applications de messagerie, avec un grand avatar, le nom de l'utilisateur et le message. react-native-elements simplifie l'écriture de notre propre liste de messages afin que nous puissions utiliser cinq lignes de code pour en faire une belle liste.

Il ressemble actuellement à ceci: [19659003]  Démonstration de l'écran des messages

Écran du profil

Créez l'écran final du profil

Créez d'abord un fichier utils / randomNo.js et collez-le comme suit:

 export const randomNo = (min, max) =>
  Math.floor (Math.random () * (max - min) + min)

La fonction randomNo renvoie un nombre aléatoire compris entre min et max .

Ouvrez maintenant composants / ProfileScreen.js et collez ce qui suit:

 import Réagissez à partir de 'réagir'
importer {Image, SafeAreaView, StyleSheet, View} à partir de 'react-native'
importer {Séparateur, Icône, Texte} à partir de 'réagir-éléments-natifs'
importer une mise en page à partir de '../constants/Layout'
importer {HomeScreenPics} de '../constants/Pics'
import {randomNo} de '../utils/randomNo'

const {pic, title} = AccueilScreenPics [randomNo(1, HomeScreenPics.length)]

const Social = ({name}) => (
  
)

la classe ProfileScreen étend React.Component {
  render () {
    revenir (
      
        
          
        
        
           {titre}
        
         Styliste chez Amelia & Co. 
        
        
           J'aime voyager. J'ai un chat nommé cornichons. S'il t'aime bien, je
          sera probablement aussi.
        
        
         Retrouvez-moi sur Social ici 
        
          
          
          
        
      
    )
  }
}

const styles = StyleSheet.create ({
  récipient: {
    flex: 1,
    alignItems: 'center',
  },
  imageContainer: {
    marge: 20,
  },
  image: {
    width: Layout.window.width - 60, // largeur du périphérique - quelques marges
    height: Layout.window.height / 2 - 60, // hauteur du périphérique / 2 - une marge
    borderRadius: 20,
  },
  Nom: {
    couleur: '# 5E5E5E',
    alignSelf: 'flex-start',
    margeLeft: 30,
  },
  desc: {
    couleur: '# 5E5E5E',
    alignSelf: 'flex-start',
    marginTop: 5,
    marginHorizontal: 30,
    fontSize: 14,
  },
  diviseur: {
    backgroundColor: '# C0C0C0',
    width: Layout.window.width - 60,
    marge: 20,
  },
  Liens sociaux: {
    flex: 1,
    alignItems: 'flex-start',
    flexDirection: 'rangée',
    width: Layout.window.width,
    margeLeft: 40,
  },
  iconContainer: {
    paddingHorizontal: 8,
    paddingVertical: 15,
  },
})

exporter ProfileScreen par défaut

Décryptons un peu le code.

Tout d'abord, nous obtenons un tableau aléatoire pic et du tableau HomeScreenPics qui n'est pas le premier. image mais peut être n'importe quel reste des images de ce tableau.

Ensuite, nous avons créé un composant Social ressemblant à ceci:

 const Social = ({name}) => (
  
)

Cela prend un nom comme accessoire. Nous l'utilisons dans notre méthode render . La méthode render contient le composant SafeAreaView habituel View et notre composant personnalisé Social - avec un un peu de style que nous avons déjà vu plus haut.

Le seul composant unique ici est un composant Divider . Les séparateurs sont des séparateurs visuels de contenu. Nous les utilisons pour distinguer différentes sections de contenu.

Enfin, nous ajoutons du style.

Cela ressemble actuellement à ceci:

 Démonstration de l’écran de profil

J’ai également fait un repo, au cas où vous voudriez le cloner. Vous pouvez le trouver ici sur GitHub.

Conclusion

Nous avons réussi à cloner une interface utilisateur Tinder avec un style personnalisé et l'aide importante de React Native Elements.

React Native Elements élimine tous les problèmes liés à la création d'une belle interface utilisateur en utilisant sa bibliothèque de composants prédéfinis.

Nous pourrions également tout créer à partir de rien, sans utiliser aucune bibliothèque d'interface utilisateur, mais cela nous obligerait à écrire beaucoup de code. - surtout le style. En utilisant une bibliothèque d'interface utilisateur, nous pouvons écrire moins de code et livrer notre application plus rapidement.

Vous pouvez maintenant imiter n'importe quelle interface utilisateur en prenant la plus petite partie de l'interface utilisateur et en la construisant. Utilisez des frameworks d'interface utilisateur pour écrire moins de code et expédier plus rapidement.






Source link