React Native &Expo – Jak si vytvořit svou první mobilní aplikaci

Slyšeli jste o React native a Expo? Vytváření desktopu je skvělé, ale co vytváření mobilních aplikací? Co když nemáte přístup k zařízení Android nebo Apple. Nebo se nechcete učit Swift nebo Java. To není problém. React native a Expo vám umožní vytvářet mobilní aplikace na jakékoli platformě pro jakoukoli platformu. Tento tutoriál vám ukáže, jak na to.

Získejte tuto úvodní šablonu na GitHubu.

Nastavení projektu Pt.1

Než začnete pracovat na samotné aplikaci, je třeba udělat několik věcí. Budete muset vytvořit několik konfiguračních souborů. Tyto soubory jsou package.json , babel.config.js a app.json . Poté byste také měli vytvořit .gitignore , alespoň pokud plánujete používat git. Při každém spuštění projektu se automaticky vygenerují některé soubory. Tyto soubory nemusí být součástí git. Začněme tímto souborem.

# ./.gitignore
node_modules/**/*
.expo/*
npm-debug.*
*.jks
*.p12
*.key
*.mobileprovision

Dále budete muset nainstalovat některé závislosti, aby se tento projekt zprovoznil. Nyní, abyste mohli použít tyto závislosti a spustit tento projekt, budete také potřebovat několik skriptů npm. Tyto skripty zahrnují skripty pro vývoj, vysunutí a testování. Ve skutečnosti budou existovat tři skripty pro vývoj – „výchozí“, jeden pro Android a jeden pro iOS.

Nyní budete muset zadat main nebo položka aplikace. Poté byste měli také zadat předvolbu pro jest . Odpověď na druhou věc je jest-expo . A pro první? Budete používat AppEntry.js od expo modul. Nyní jste připraveni nainstalovat všechny závislosti s přízí nebo npm. Takže npm install nebo yarn .

Kromě toho budete pravděpodobně muset nainstalovat expo-cli . A tuto závislost byste měli nainstalovat globálně.

// ./package.json
{
  "main": "node_modules/expo/AppEntry.js",
  "private": true,
  "jest": {
    "preset": "jest-expo"
  },
  "scripts": {
    "start": "expo start",
    "android": "expo start --android",
    "ios": "expo start --ios",
    "eject": "expo eject",
    "test": "node ./node_modules/jest/bin/jest.js --watchAll"
  },
  "dependencies": {
    "expo": "^31.0.2",
    "react": "16.5.0",
    "react-native": "https://github.com/expo/react-native/archive/sdk-31.0.0.tar.gz",
    "react-navigation": "^2.18.2"
  },
  "devDependencies": {
    "babel-preset-expo": "^5.0.0",
    "jest-expo": "^31.0.0"
  }
}

Nastavení projektu Pt.2

To byla první část. Zbývají dva poslední kroky. Nejprve budete muset vytvořit babel.config.js aby se ujistil, že je kód transpilován, měl by být. Za druhé, vaše aplikace bude potřebovat konfiguraci ve formě JSON. Toto bude hlavní konfigurační soubor pro Expo pro nastavení vaší aplikace a její správné fungování. Začněme s babel.config.js .

// ./babel.config.js

module.exports = function(api) {
  api.cache(true)

  return {
    presets: ['babel-preset-expo']
  }
}

Poté dáme dohromady hlavní konfigurační soubor pro Expo. Až budete s tímto souborem hotovi, je čas začít pracovat na samotné aplikaci.

// ./app.json
{
  "expo": {
    "name": "react-native-app",
    "slug": "react-native-app",
    "privacy": "public",
    "sdkVersion": "31.0.0",
    "platforms": [
      "ios",
      "android"
    ],
    "version": "0.0.1",
    "orientation": "portrait",
    "icon": "./assets/images/icon.png",
    "splash": {
      "image": "./assets/images/splash.png",
      "resizeMode": "contain",
      "backgroundColor": "#ffffff"
    },
    "updates": {
      "fallbackToCacheTimeout": 0
    },
    "assetBundlePatterns": [
      "**/*"
    ],
    "ios": {
      "supportsTablet": true
    }
  }
}

Poznámka:Jak jste si možná všimli, v konfiguraci Expo jsou zmíněny dva externí zdroje. Jmenovitě ‚ikona‘ a ‚obrázek‘ uvnitř ‚splash‘. Všechny potřebné informace, které potřebujete k vytvoření vlastního úvodního obrázku, jsou v [dokumentaci úvodních obrazovek Expo]. A pokud jde o ikonu, přejděte na [dokumentace aplikace ikony Expo]. Poté vytvořte ./assets/images/ adresář a vložte tam svou ikonu a úvodní obrázek.

Přidání některých konstant

Když vytváříte svou nativní aplikaci React, možná budete chtít znovu použít některé věci. Můžete například chtít použít stejné barvy. Je to velmi dobrý nápad, aby byl design a styl vaší aplikace konzistentní. Vytvořme tedy novou složku s názvem constants v kořenu. Poté v této složce vytvořte nový soubor s názvem Colors.js .

Zde můžete přidat barvy pro výchozí scénáře a stavy. Například chyby, aktivní prvky, varování, upozornění, odstíny barev a tak dále. A nezapomeňte exportovat svou paletu barev.

// ./constants/Colors.js

const tintColor = '#2f95dc'

export default {
  tintColor,
  tabIconDefault: '#ccc',
  tabIconSelected: tintColor,
  tabBar: '#fefefe',
  errorBackground: 'red',
  errorText: '#fff',
  warningBackground: '#eaeb5e',
  warningText: '#666804',
  noticeBackground: tintColor,
  noticeText: '#fff'
}

Poté můžete také chtít mít nějaké obecné konstanty. Například konstanty pro width a height zařízení, na kterém vaše aplikace běží. Vytvořme tedy ještě jeden soubor ve stejném adresáři s názvem Layout.js . Zde můžete použít Dimensions modul poskytovaný React native pro získání width a height zařízení. Poté se znovu ujistěte, že tyto konstanty exportujete.

// ./constants/Layout.js

// Import 'Dimensions' module from 'react-native'
import { Dimensions } from 'react-native'

// Create constants for app width and height
const width = Dimensions.get('window').width
const height = Dimensions.get('window').height

// Export everything
export default {
  window: {
    width,
    height
  },
  isSmallDevice: width < 375
}

Vytvoření jednoduché komponenty

Nyní vytvoříme jednoduchou komponentu. Může to být ikona, která bude na navigační liště nebo na liště klepnutí. Nedělejte si starosti. Nemusíte si vytvářet vlastní ikonu od začátku. Můžete použít Icon modul od Expo a přizpůsobte si jej podle svého vkusu a potřeb. Níže je jednoduchý příklad takové ikony. Můžete tomu říkat TabBarIcon a vložte jej do nového adresáře s názvem components .

// ./components/TabBarIcon.js

// Import React and 'Icon' module from 'Expo'
import React from 'react'
import { Icon } from 'expo'

// Import color constants
import Colors from '../constants/Colors'

// Create, and export, component for navigation icon
export default class TabBarIcon extends React.Component {
  render() {
    return (
      <Icon.Ionicons
        name={this.props.name}
        size={26}
        style={{ marginBottom: -3 }}
        color={this.props.focused ? Colors.tabIconSelected : Colors.tabIconDefault}
      />
    )
  }
}

Vytvoření navigační lišty

V liště pro klepnutí máte komponentu pro ikonu, ale zatím nemáte žádnou lištu karet. Pojďme to postavit. Opět je to jednodušší, protože React native udělá většinu těžkých břemen za vás. Začnete importem Reactu a jednoho užitečného modulu z nativního Reactu s názvem Platform . Tento modul vám pomůže rozpoznat, na jaké platformě, konkrétně OS, vaše aplikace běží.

Tyto informace pak můžete použít k výběru konkrétní ikony pro iOS i Android. Poté budete také muset importovat createStackNavigator
a createBottomTabNavigator od react-navigation . Použijete createStackNavigator určit, která součást obrazovky se má na jaké obrazovce zobrazit. Potom použijete createBottomTabNavigator vytvořit a exportovat jednoduchý panel karet ve spodní části obrazovky.

Tato dotyková lišta pak vám a uživatelům vaší aplikace umožní přepínat mezi různými obrazovkami aplikace nebo trasami. To také znamená, že toto je místo, kam importujete všechny součásti obrazovky pro nativní aplikaci React.

// ./navigation/MainTabNavigator.js

// Import React and all necessary modules
import React from 'react'
import { Platform } from 'react-native'
import { createStackNavigator, createBottomTabNavigator } from 'react-navigation'

// Import screens
import HomeScreen from '../screens/HomeScreen'
import AboutScreen from '../screens/AboutScreen'
import SettingsScreen from '../screens/SettingsScreen'

// Import TabBarIcon component
import TabBarIcon from '../components/TabBarIcon'

// Add stack for Home screen
const HomeStack = createStackNavigator({
  Home: HomeScreen // Specify component for each screen
})

// Add stack for About screen
const AboutStack = createStackNavigator({
  About: AboutScreen // Specify component for each screen
})

// Add stack for Settings screen
const SettingsStack = createStackNavigator({
  Settings: SettingsScreen // Specify component for each screen
})

// Create and setup navigation item for Home screen
HomeStack.navigationOptions = {
  tabBarLabel: 'Home', // Text shown below the icon in tap bar
  tabBarIcon: ({ focused }) => (
    <TabBarIcon
      focused={focused}
      name={Platform.OS === 'ios' ? `ios-home` : 'md-home'}
    />
  )
}

// Create and setup navigation item for Settings screen
SettingsStack.navigationOptions = {
  tabBarLabel: 'Settings', // Text shown below the icon in tap bar
  tabBarIcon: ({ focused }) => (
    <TabBarIcon
      focused={focused}
      name={Platform.OS === 'ios' ? 'ios-options' : 'md-options'}
    />
  )
}

// Create and setup navigation item for About screen
AboutStack.navigationOptions = {
  tabBarLabel: 'About', // Text shown below the icon in tap bar
  tabBarIcon: ({ focused }) => (
    <TabBarIcon
      focused={focused}
      name={Platform.OS === 'ios' ? 'ios-information-circle' : 'md-information-circle'}
    />
  )
}

// Export stacks for all app screens
export default createBottomTabNavigator({
  HomeStack,
  AboutStack,
  SettingsStack
})

Vytvoření jednoduchého navigačního přepínače pro směrování

Zbývá poslední věc k dokončení směrování vaší nativní aplikace React. Musíte vytvořit přepínač navigátoru. Hlavním úkolem tohoto přepínače je zobrazit vždy pouze jednu obrazovku. K tomu použijete formulář modulu react-navigation s názvem createSwitchNavigator . Tento modul se o vše postará.

Kromě toho budete také importovat React a MainTabNavigator komponentu, kterou jste vytvořili v předchozí části, klepněte na lištu. Vytvoření navigačního přepínače bude snadné a rychlé. Budete potřebovat pouze tři řádky kódu. V podstatě určíte, že MainTabNavigator součástí je hlavní spínač navigátoru. Poté jej jako obvykle exportujte.

// ./navigation/AppNavigator.js

// Import React and 'createSwitchNavigator' module from 'react-navigation'
import React from 'react'
import { createSwitchNavigator } from 'react-navigation'

// Import main navigation
import MainTabNavigator from './MainTabNavigator'

// Create, and export, navigator switch
export default createSwitchNavigator({
  Main: MainTabNavigator
})

Vytvoření komponenty aplikace

Nyní dáme dohromady hlavní komponentu aplikace. Tato součást bude velmi jednoduchá. Bude obsahovat pouze jeden view , vaše AppNavigator komponenta a výchozí StatusBar pokud vaše nativní aplikace React běží na platformě iOS. Zobrazení je hlavním stavebním kamenem uživatelského rozhraní vaší aplikace. Pokud jste obeznámeni s vývojem webu, můžete si to představit jako div .

Jako obvykle začnete importováním Reactu a vašeho AppNavigator komponent. A co zbytek? Opět není třeba vše psát sám. Místo toho můžete importovat všechny potřebné komponenty uživatelského rozhraní jako moduly z nativní knihovny React. A můžete také přidat několik jednoduchých stylů. A jako vždy, až budete hotovi, nezapomeňte exportovat App komponenta.

// ./App.js

// Import React and necessary UI modules
import React from 'react'
import { Platform, StatusBar, StyleSheet, View } from 'react-native'

// Import main navigation
import AppNavigator from './navigation/AppNavigator'

// Add some simple styles
const styles = StyleSheet.create({
  container: {
    flex: 1,
    backgroundColor: '#fff'
  }
})

// Create and export the main App component
export default class App extends React.Component {
  render() {
    return (
      <View style={styles.container}>
        {/* If app is running on iOS, show default status bar */}
        {Platform.OS === 'ios' && <StatusBar barStyle="default" />}

        {/* Show main app tap bar */}
        <AppNavigator />
      </View>
    )
  }
}

Domovská obrazovka

Dobře, pojďme vytvořit vaši první obrazovku. Nejprve importujte React a všechny komponenty uživatelského rozhraní, které chcete použít, z nativního Reactu. Samotná domovská obrazovka může být jednoduchá. Stačí nějaký nadpis. Spolu s některými styly, aby obrazovka vypadala pěkně. Můžete také zobrazit oznámení, že je vaše aplikace ve vývojovém nebo produkčním režimu.

Normálně pomocí view jako hlavní nádoba by stačila. Pokud však chcete přidat něco dalšího, může být dobré použít také ScrollView komponent. To vám nebo jinému uživateli umožní rolování. Pokud chcete tuto komponentu používat, ujistěte se, že je vnořena do view . Dokončete komponentu pro domovskou obrazovku jejím exportem.

Jedna věc. Jak uvidíte, vaše komponenta obrazovky obsahuje statický objekt nazvaný navigationOptions . To vám umožní použít záhlaví nad zbytkem obsahu na aktivní obrazovce. K tomu stačí použít nějaký text. Pokud chcete tuto hlavičku zakázat, nastavte ji na null .

// ./screens/HomeScreen.js

// Import React, necessary UI modules from React native
import React from 'react'
import { ScrollView, StyleSheet, Text, View } from 'react-native'

// Add some simple styles
const styles = StyleSheet.create({
  container: {
    flex: 1,
    backgroundColor: '#fff'
  },
  developmentModeText: {
    marginBottom: 20,
    color: 'rgba(0, 0, 0, .4)',
    fontSize: 14,
    lineHeight: 19,
    textAlign: 'center'
  },
  contentContainer: {
    paddingTop: 30,
  },
  welcomeContainer: {
    alignItems: 'center',
    marginTop: 10,
    marginBottom: 20
  },
  getStartedContainer: {
    alignItems: 'center',
    marginHorizontal: 50
  },
  welcomeText: {
    fontSize: 21,
    fontWeight: '700'
  }
})

// Create and export Home screen component
export default class HomeScreen extends React.Component {
  static navigationOptions = {
    header: null // disable app header
  }

  // Show notification about mode
  showDevelopmentModeWarning() {
    if (__DEV__) {
      return (
        <Text style={styles.developmentModeText}>
          Development mode is enabled, your app will be slower but you can use useful development
          tools.
        </Text>
      )
    } else {
      return (
        <Text style={styles.developmentModeText}>
          You are not in development mode, your app will run at full speed.
        </Text>
      )
    }
  }

  render() {
    return (
      <View style={styles.container}>
        <ScrollView style={styles.container} contentContainerStyle={styles.contentContainer}>
          <View style={styles.welcomeContainer}>
            <Text style={styles.welcomeText}>Welcome!</Text>
          </View>

          <View style={styles.getStartedContainer}>
            {this.showDevelopmentModeWarning()}
          </View>
        </ScrollView>
      </View>
    )
  }
}

O obrazovce

O obrazovce může být další užitečná obrazovka. Můžete jej použít k tomu, abyste uživateli své aplikace poskytli další užitečné informace. Můžete například zobrazit ikonu své aplikace, její název, slimák a popis. Můžete také zobrazit své jméno a verzi své aplikace. Pojďme na to.

// ./screens/AboutScreen.js

// Import React and necessary UI modules
import React from 'react'
import { Text, ScrollView, StyleSheet, View } from 'react-native'
import { Icon } from 'expo'

// Add some simple styles
const styles = StyleSheet.create({
  container: {
    flex: 1,
    paddingTop: 15,
    backgroundColor: '#fff'
  },
  aboutTitleContainer: {
    paddingHorizontal: 15,
    paddingBottom: 15,
    paddingLeft: 8,
    flexDirection: 'row'
  },
  aboutTitleIconContainer: {
    marginRight: 15,
    paddingTop: 2
  },
  aboutNameText: {
    fontSize: 18,
    fontWeight: '600'
  },
  aboutSlugText: {
    fontSize: 14,
    color: '#a39f9f',
    backgroundColor: 'transparent'
  },
  aboutDescriptionText: {
    marginTop: 4,
    fontSize: 13,
    color: '#4d4d4d'
  },
  aboutHeaderContainer: {
    paddingVertical: 8,
    paddingHorizontal: 15,
    backgroundColor: '#fbfbfb',
    borderWidth: 1,
    borderColor: '#ededed'
  },
  aboutHeaderText: {
    fontSize: 14
  },
  aboutContentContainer: {
    paddingTop: 8,
    paddingBottom: 12,
    paddingHorizontal: 15
  },
  aboutContentText: {
    color: '#808080',
    fontSize: 14
  }
})

// Create and export About screen component
export default class AboutScreen extends React.Component {
  static navigationOptions = {
    title: 'About' // Enable app header and use 'About' as the label
  }

  render() {
    return (
      <ScrollView style={styles.container}>
        <View style={styles.aboutTitleContainer}>
          <View style={styles.aboutTitleIconContainer}>
            <Icon.Ionicons
              name="ios-home"
              size={60}
            />
          </View>

          <View style={styles.aboutTitleTextContainer}>
            <Text style={styles.aboutNameText} numberOfLines={1}>
              react-native-app
            </Text>

            <Text style={styles.aboutSlugText} numberOfLines={1}>
              react-native-app
            </Text>

            <Text style={styles.aboutDescriptionText}>
              Your first cool Reactive Native app.
            </Text>
          </View>
        </View>

        <View>
          <View style={styles.aboutHeaderContainer}>
            <Text style={styles.aboutHeaderText}>
              App name
            </Text>
          </View>

          <View style={styles.aboutContentContainer}>
            <Text style={styles.aboutContentText}>
              react-native-app
            </Text>
          </View>
        </View>

        <View>
          <View style={styles.aboutHeaderContainer}>
            <Text style={styles.aboutHeaderText}>
              Author
            </Text>
          </View>

          <View style={styles.aboutContentContainer}>
            <Text style={styles.aboutContentText}>
              John Doe
            </Text>
          </View>
        </View>

        <View>
          <View style={styles.aboutHeaderContainer}>
            <Text style={styles.aboutHeaderText}>
              Version
            </Text>
          </View>

          <View style={styles.aboutContentContainer}>
            <Text style={styles.aboutContentText}>
              0.0.1
            </Text>
          </View>
        </View>
      </ScrollView>
    )
  }
}

Obrazovka Nastavení

Vezměme vaši nativní aplikaci React o něco dále. Jak? Můžete vytvořit jednoduchou obrazovku nastavení s funkčními přepínači. Tyto přepínače pak umožní povolit nebo zakázat funkce, které budete chtít vytvořit později. Dobrou zprávou je, že i budování těchto přepínačů bude rychlé. Ano, nativní knihovna React má vše, co potřebujete.

Jediné, co musíte udělat, je importovat prvek uživatelského rozhraní nebo modul, který chcete použít, Switch . A pro správu stavů zapnutí/vypnutí těchto přepínačů? Můžete použít React state pomocí jednoduché metody změnit stav přepínačů z true na false nebo naopak.

// ./screens/SettingsScreen.js

// Import React and necessary UI modules
import React from 'react'
import { Text, ScrollView, StyleSheet, Switch, View } from 'react-native'

// Import color constants
import Colors from '../constants/Colors'

// Add some simple styles
const styles = StyleSheet.create({
  container: {
    flex: 1,
    paddingTop: 15,
    backgroundColor: '#fff'
  },
  switchContainer: {
    display: 'flex',
    alignItems: 'center',
    flexDirection: 'row',
    justifyContent: 'space-between',
    marginBottom: 16,
    paddingHorizontal: 15
  },
  switchLabel: {
    flex: 0
  }
})

// Create and export Settings screen component
export default class SettingsScreen extends React.Component {
  static navigationOptions = {
    title: 'Settings' // Enable app header and use 'Settings' as the label
  }

  // Define default states for switch components
  state = {
    isOptionOneEnabled: false,
    isOptionTwoEnabled: false,
    isOptionThreeEnabled: false,
    isOptionFourEnabled: false
  }

  // Handle change of switch state
  handleSwitch = (option) => {
    this.setState({
      [option]: !this.state[option]
    })
  }

  render() {
    return (
      <ScrollView style={styles.container}>
        <View style={styles.switchContainer}>
          <Text style={styles.switchLabel}>
            Option 1
          </Text>

          <Switch trackColor={{true: Colors.tintColor}} onValueChange={() => this.handleSwitch('isOptionOneEnabled')} value={this.state.isOptionOneEnabled} />
        </View>

        <View style={styles.switchContainer}>
          <Text style={styles.switchLabel}>
            Option 2
          </Text>

          <Switch trackColor={{true: Colors.tintColor}} onValueChange={() => this.handleSwitch('isOptionTwoEnabled')} value={this.state.isOptionTwoEnabled} />
        </View>

        <View style={styles.switchContainer}>
          <Text style={styles.switchLabel}>
            Option 3
          </Text>

          <Switch trackColor={{true: Colors.tintColor}} onValueChange={() => this.handleSwitch('isOptionThreeEnabled')} value={this.state.isOptionThreeEnabled} />
        </View>

        <View style={styles.switchContainer}>
          <Text style={styles.switchLabel}>
            Option 4
          </Text>

          <Switch trackColor={{true: Colors.tintColor}} onValueChange={() => this.handleSwitch('isOptionFourEnabled')} value={this.state.isOptionFourEnabled} />
        </View>
      </ScrollView>
    )
  }
}

Epilolog:React Native &Expo – Jak vytvořit svou první mobilní aplikaci

gratuluji! Právě jste vytvořili svou vlastní mobilní aplikaci s React native a Expo! Doufám, že se vám tento tutoriál líbil, bavili jste se a hodně se naučili. To byl však jen začátek vaší cesty. Je toho mnohem mnohem víc. Takže, kam se odtud vydat? Jsou dvě místa, kam byste měli jít. První z nich je Expo Documentation.

Druhým je dokumentace pro React native. Tato dvě místa obsahují všechny informace, které potřebujete, abyste svou nativní aplikaci React posunuli na jinou úroveň. Proč zůstat jen u toho, co jste se dnes naučili. Nyní víte, jak používat React native a Expo k vytvoření úžasné aplikace, kterou jste vždy chtěli mít. Takže pokračujte a postavte to!