Phoenix とExpoで作るスマホアプリ ⑤ expo セットアップ編


Phoenix とExpoで作るスマホアプリ ①Phoenix セットアップ編 + phx_gen_auth
Phoenix とExpoで作るスマホアプリ ②JWT認証+CRUD編
Phoenix とExpoで作るスマホアプリ ③ファイルアップロード編
Phoenix とExpoで作るスマホアプリ ④多対多のリレーション編
Phoenix とExpoで作るスマホアプリ ⑤ expo セットアップ編 <- 本記事

前回は多対多のリレーションを実装しました

今回はexpoのセットアップとベースとなるスクリーン・タブを実装していこうと思います

Install

以下のコマンドで一発です簡単ですね

npm install --global expo-cli

プロジェクト作成

ではプロジェクトを作成していきましょう
以下のコマンドで生成ウィザードが出てきます

expo init sns

使用するテンプレートを聞かれるので今回はmanaged workflowのblankを選択
typescriptだったりtabsをどう実装しているのかを見たい場合は下の項目を選択してください

更に下にbare workflowもありますが、こちらはexpoではなく素のreact nativeでexpoのツールキットを使用するものなので今回は使用しません

- Managed workflow -----
❯ blank                 a minimal app as clean as an empty canvas 
  blank (TypeScript)    same as blank but with TypeScript configuration 
  tabs (TypeScript)     several example screens and tabs using react-navigation

フォルダ構成

フォルダ構成は以下のようにしていきます
atomic designを使用して開発していく場合はcomponentsやscreenの下で
atom,molecules等更にフォルダを作成していきましょう

- api サーバーとの通信や外部APIを叩く処理
- assets 画像関連
- components 共通コンポーネント
- context useContext関連
- hooks customHooks関連
- navigation react-navigation関連
- screens 各ページとページ毎のcomponent
  |- Home
   |- atom
   |- molecules
   |- organisms
- App.js main 

使用するライブラリ

本記事で追加するライブラリになります
他の記事で別のライブラリも追加される可能性があります

  • ナビゲーション
    react-navigation
    デファクト
  • UIライブラリ
    react-native-elements
    native-baseもありますが、カスタムしやすいのとドキュメントもスッキリしてて読みやすいのでこちらを使用します
  • ユーティリティ
    axios
    非同期通信
    form-data
    ファイルとかを送信するのに使用します
expo install @react-navigation/native @react-navigation/bottom-tabs
expo install react-native-gesture-handler react-native-reanimated react-native-screens react-native-safe-area-context @react-native-community/masked-view
expo install react-native-elements react-native-vector-icons
expo install axios form-data

Tabの実装

認証機能に取り掛かる前にベースとなるスクリーンとタブを実装していきましょう

//[new] screens/HomeScreen.js
import React from "react";
import { View, Text, StyleSheet } from "react-native";

const HomeScreen = () => {
  return (
    <View style={styles.container}>
      <Text>HomeScreen</Text>
    </View>
  );
};

const styles = StyleSheet.create({
  container: {
    justifyContent: "center",
    alignSelf: "center",
    flex: 1,
  },
});
export default HomeScreen;

HomeのところをAccountに変えてAccountScreen.jsも作成しましょう

ベースとなるスクリーンを作成しましたので次にTabを実装します
NavigationContainerを作成してその下にTabやStackのNavigationを配置していきます

// [new] navigation/AppNavigator.js
import React from "react";
import { NavigationContainer } from "@react-navigation/native";
import { createBottomTabNavigator } from "@react-navigation/bottom-tabs";
import HomeScreen from "../screens/HomeScreen";
import AccountScreen from "../screens/AccountScreen";

const AppNavigator = () => {
  const Tab = createBottomTabNavigator();

  return (
    <NavigationContainer>
      <Tab.Navigator>
        <Tab.Screen name="Home" component={HomeScreen} />
        <Tab.Screen name="Account" component={AccountScreen} />
      </Tab.Navigator>
    </NavigationContainer>
  );
};

export default AppNavigator;

これでタブができたので実際に表示しましょう
App.jsで作成したAppNavigatorを表示します
背景が白なのでStatusBarが見えなくなるのでstyleをdarkにします

// [edit] App.js
import { StatusBar } from "expo-status-bar";
import React from "react";
import AppNavigator from "./navigation/AppNavigator";

export default function App() {
  return (
    <>
      <StatusBar style="dark" />
      <AppNavigator />
    </>
  );
}

これでタブが実装完了しました
動作確認をしてみましょう

動作確認

expo start でサーバーを起動させて
iosかandroidお好きな方で確認してみましょう

無事ベースとなるスクリーンとタブが実装されているのが確認できました
今回はここまでになります
次回は認証機能を実装していきます

今回の差分
https://github.com/thehaigo/sns-expo/commit/11eacba9edea7d8eead81e534bf56b417cbf2036

参考サイト

https://reactnavigation.org/docs/getting-started
https://reactnativeelements.com/docs/
https://github.com/axios/axios
https://github.com/form-data/form-data#readme
https://docs.expo.io/