対象読者
- JavaScriptとWeb開発の基礎に理解がある方
- Reactを用いたJavaScriptアプリケーション開発の未経験者
前提環境
筆者の検証環境は以下の通りです。
- macOS Catalina 10.15.3
- Node.js 12.16.1/npm 6.13.4
- expo-cli 3.18.4
- expo 36.0.2(React Native 0.61)
- React 16.9.0
メモアプリを完成させる
前回から2回に分けて、実践的なアプリ開発のサンプルとして、メモアプリを開発しています。前回は、データ構造を決めてサンプルデータを作成し、それを元にメモの一覧を表示するところまで解説しました(図1の左側)。
今回は、その続きとしてメモデータを作成できる画面を作り、アプリとして完成させるところまでを解説します。作業工程の全体像を、改めて確認しておきましょう。
- (済)プロジェクトを作成する
- (済)使う予定のあるライブラリをインストールする
-
(済)メイン画面を仮組みする
- アプリで扱うデータの構造を決める
- サンプルデータを作る
- サンプルデータを無加工でUIに表示する
- データを加工し、レイアウトを調整して見た目を整える
-
作成画面を作る
- UIを作成する
- データを保存する
-
メイン画面を完成させる
- 作成画面で保存したデータを表示する
1〜3は前回までに実施済みです。今回解説する内容は、4〜5の内容になります。
メモ作成画面の見た目を作る
それでは、メモを作成するための画面を作っていきましょう。作業は以下の流れで行います。
- StackNavigatorにメモ作成画面を登録する
- 画面間を行き来できるようにする
- メモ作成画面の見た目を作り込む
まだデータの保存方法は決まっていないので、まずは画面遷移の流れや見た目のみに注力することになります。
StackNavigatorにメモ作成画面を登録する
まずは、メモ作成画面への画面遷移が成立することを目指しましょう。画面そのものである ComposeScreen
コンポーネントを作成して、React Navigationに登録します。内容を作り込むのは後でもいいので、この時点でのComposeScreen
は、リスト1のように簡素なものにしておきます。
import React from 'react'; import { View, Text, StyleSheet } from 'react-native'; export const ComposeScreen = () => { return ( <View style={styles.container}> <Text>メモ作成画面</Text> </View> ) }; const styles = StyleSheet.create({ container: { flex: 1, alignItems: "center", justifyContent: "center", }, });
まだプレビューはできませんが、中央に「メモ作成画面」というテキストが表示されているだけの、簡素な画面になることが想像できます。
続いて、ComposeScreen
をReact NavigationのStack Navigatorに登録しましょう(リスト2)。
// 省略 import { MainScreen } from './src/MainScreen'; + import { ComposeScreen } from './src/ComposeScreen'; const Stack = createStackNavigator(); export default function App() { return ( <PaperProvider> <NavigationContainer> <Stack.Navigator> <Stack.Screen name="Main" component={MainScreen} options={{ title: 'メモ帳' }} /> {/* (1) */} + <Stack.Screen + name="Compose" + component={ComposeScreen} + options={{ + title: '作成' + }} + /> </Stack.Navigator> </NavigationContainer> </PaperProvider> ); }
(1)で <Stack.Screen />
を追加し、ComposeScreen
がMainScreen
と行き来できる画面であることを宣言しました。
画面間を行き来できるようにする
次は、実際に画面間を移動できるようにします。MainScreen
に「新規作成ボタン」を設置し、これを押すとComposeScreen
に移動するようにします(リスト3)。
// 省略 import { List, FAB } from 'react-native-paper'; import { useNavigation } from '@react-navigation/native'; // 省略 export const MainScreen = () => { const navigation = useNavigation(); const onPressAdd = () => { navigation.navigate('Compose'); // (3) }; return ( <View style={styles.container}> <FlatList // 省略 /> {/* (1) */} <FAB style={{ // (2) position: 'absolute', right: 16, bottom: 16, }} icon="plus" onPress={onPressAdd} /> </View> ); }
図1を見ると、「新規作成ボタン」は右下にFloating Action Button(FAB)を配置して実現することになっています。今回は(1)のようにreact-native-paperの<FAB />
コンポーネントを利用しました。icon="plus"
を指定して、「+」のアイコンが表示されるようにしています。また、画面の右下にFlatListと重なる形で表示させるために、(2)のようにposition: 'absolute'
を記載して、絶対座標で表示位置を指定しています。画面の右端から16、下端から16の位置に表示されるようにしました(図2)。
(3)では、FABのonPress
イベントでReact Navigationのnavigate
関数を実行して、ComposeScreen
への移動を実現しています。これで画面間の行き来ができるようになりました(図3)。
MainScreen
に戻るためのUIも自動で追加されています。これで下準備が整いました。
メモ作成画面の見た目を作り込む
メモ作成画面が開けるようになったので、画面内を作り込んでいきましょう。リスト1で実装した内容はすべて消して、リスト4の通り実装します。
import React, { useState } from 'react'; import { StyleSheet, KeyboardAvoidingView, Platform } from 'react-native'; import { TextInput, Button } from 'react-native-paper'; export const ComposeScreen = () => { const [ text, setText ] = useState(''); const onPressSave = () => { // TODO 保存処理 }; return ( <KeyboardAvoidingView // (1) style={styles.container} > <TextInput style={{ marginBottom: 16 }} mode="outlined" placeholder="メモを入力してください" multiline onChangeText={(text) => setText(text)} /> <Button mode="contained" onPress={onPressSave} > 保存 </Button> </KeyboardAvoidingView> ) }; const styles = StyleSheet.create({ container: { flex: 1, padding: 16, }, });
TextInput
に入力された文字列を、useState
で保持する形にしました。キーボードで入力欄が隠れないよう、念のため最上位である(1)にKeyboardAvoidingView
を配置しています。これを実行すると、図4のようになります。
簡素ではありますが、少しアプリらしくなってきました。あとは実際の動きを作り込んでいきましょう。