2024.02.07
BLOG
【ReactNative】映画情報アプリを作ろう!/#2APIを使って映画一覧画面を作ろう編
2023-01-26
どうもロックシステムのコジです!
今回は前回の続きReactNativeを使って映画検索アプリを作っています。
1回目では環境構築をして、ReactNativeの復習をしながら画面の大枠を作成し、APIの登録をしました。
・1回目はこちら!
2回目の今回は前回登録したAPIを使って映画一覧画面を作っていきます。
参考リンク等はこちら
00:43 TMDBサイトURL
https://www.themoviedb.org/?language=ja
02:23 axiosインストールコマンド
npm install axios
07:45 スマホからアプリを見る方法
1.movieAppプロジェクトからShift + 右クリックでPowerShellを開く
2.expo startコマンドを打って開発用スマホからExpo Goアプリを開いてmovieAppを選択
3.スマホ側でアプリが出てこない場合はスマホとPCが同じネット環境に繋がっているか確認しよう
4.PowerShellで「d」を押してブラウザを開いて、左側にあるiPhoneをクリック
08:13 FlatList
08:25 Imageタグのsource
<FlatList
data={nowPlaying}
keyExtractor={item => item.id}
horizontal={true}
flashScrollIndicators
renderItem={({ item }) => (
<View style={styles.movieContainer}>
<Image style={styles.movieImage} source={{uri: `https://image.tmdb.org/t/p/w300${item.poster_path}`}}></Image>
<Text numberOfLines={1} style={styles.movieTitle}>{item.title}</Text>
</View>
)}>
</FlatList>
13:22 ランダムな映画の取得方法参考リンク
https://developer.mozilla.org/ja/docs/Web/JavaScript/Reference/Global_Objects/Math/random
2回目の完成コードはこちら!
ファイル名:App.jsimport { StatusBar } from 'expo-status-bar';
import { StyleSheet, Text, View, ScrollView, FlatList, Image } from 'react-native';
import { requests } from './request';
import axios from 'axios';
import { useState, useEffect } from 'react';
export default function App() {
const [nowPlaying, setNowPlaying] = useState({});
const [commingSoon, setCommingSoon] = useState({});
const [populars, setPopulars] = useState({});
const [topRated, setTopRated] = useState({});
const [picupMovies, setPicupMovies] = useState({});
useEffect(() => {
async function getMovies() {
try {
const nowPlayingMovies = await axios.get(requests.NOW_PLAYING);
setNowPlaying(nowPlayingMovies.data.results);
const commingSoonMovies = await axios.get(requests.COMMING_SOON);
setCommingSoon(commingSoonMovies.data.results);
const popularsMovies = await axios.get(requests.POPULARS);
setPopulars(popularsMovies.data.results);
const topRatedMovies = await axios.get(requests.TOP_RATED);
setTopRated(topRatedMovies.data.results);
} catch (error) {
console.log(error);
}
}
async function getPickUpMovie() {
try {
const result = await axios.get(requests.NOW_PLAYING);
const number = Math.floor(Math.random() * (result.data.results.length - 1) + 1);
setPicupMovies(result.data.results[number]);
} catch (error) {
console.log(error);
}
}
getMovies();
getPickUpMovie();
}, []);
return (
<ScrollView style={styles.container}>
<View style={styles.pickupContainer}>
<Image style={styles.pickupImage} source={{uri: `https://image.tmdb.org/t/p/w780${picupMovies.poster_path}`}}></Image>
<Text style={styles.pickupTitle}>{picupMovies.title}</Text>
</View>
<Text style={styles.listName}>公開中の映画</Text>
<FlatList
data={nowPlaying}
keyExtractor={item => item.id}
horizontal={true}
flashScrollIndicators
renderItem={({ item }) => (
<View style={styles.movieContainer}>
<Image style={styles.movieImage} source={{uri: `https://image.tmdb.org/t/p/w300${item.poster_path}`}}></Image>
<Text numberOfLines={1} style={styles.movieTitle}>{item.title}</Text>
</View>
)}>
</FlatList>
<Text style={styles.listName}>公開予定の映画</Text>
<FlatList
data={commingSoon}
keyExtractor={item => item.id}
horizontal={true}
flashScrollIndicators
renderItem={({ item }) => (
<View style={styles.movieContainer}>
<Image style={styles.movieImage} source={{uri: `https://image.tmdb.org/t/p/w300${item.poster_path}`}}></Image>
<Text numberOfLines={1} style={styles.movieTitle}>{item.title}</Text>
</View>
)}>
</FlatList>
<Text style={styles.listName}>人気の映画</Text>
<FlatList
data={populars}
keyExtractor={item => item.id}
horizontal={true}
flashScrollIndicators
renderItem={({ item }) => (
<View style={styles.movieContainer}>
<Image style={styles.movieImage} source={{uri: `https://image.tmdb.org/t/p/w300${item.poster_path}`}}></Image>
<Text numberOfLines={1} style={styles.movieTitle}>{item.title}</Text>
</View>
)}>
</FlatList>
<Text style={styles.listName}>高評価の映画</Text>
<FlatList
data={topRated}
keyExtractor={item => item.id}
horizontal={true}
flashScrollIndicators
renderItem={({ item }) => (
<View style={styles.movieContainer}>
<Image style={styles.movieImage} source={{uri: `https://image.tmdb.org/t/p/w300${item.poster_path}`}}></Image>
<Text numberOfLines={1} style={styles.movieTitle}>{item.title}</Text>
</View>
)}>
</FlatList>
<StatusBar style="auto" />
</ScrollView>
);
}
const styles = StyleSheet.create({
container: {
flex: 1,
backgroundColor: '#202328'
},
pickupContainer: {
width: '100%',
flexDirection: 'row',
alignItems: 'center',
justifyContent: 'center'
},
pickupImage: {
height: 350,
width: '45%',
resizeMode: 'contain'
},
pickupTitle: {
color: '#fff',
fontSize: 24,
fontWeight: 'bold',
width: '45%',
marginLeft: 5
},
listName: {
color: '#fff',
fontSize: 18,
fontWeight: 'bold'
},
movieContainer: {
width: 130,
marginBottom:30
},
movieImage: {
height: 200,
marginRight: 10,
resizeMode: 'contain'
},
movieTitle: {
color: '#ccc',
fontSize: 14
}
});
ファイル名:request,jsconst BASE_URL = 'https://api.themoviedb.org/3';
const API_KEY = '6e044104eab08fa1afbc1bce908316a1';
export const requests = {
NOW_PLAYING :`${BASE_URL}/movie/now_playing?api_key=${API_KEY}&language=ja&page=1`,
COMMING_SOON:`${BASE_URL}/movie/upcoming?api_key=${API_KEY}&language=ja&page=1`,
POPULARS:`${BASE_URL}/movie/popular?api_key=${API_KEY}&language=ja&page=1`,
TOP_RATED:`${BASE_URL}/movie/top_rated?api_key=${API_KEY}&language=ja&page=1`
}

株式会社ロックシステム
「ブラック企業をやっつけろ!!」を企業理念にエンジニアが働きやすい環境をつきつめる大阪のシステム開発会社。2014年会社設立以来、残業時間ほぼゼロを達成し、高い従業員還元率でエンジニアファーストな会社としてIT業界に蔓延るブラックなイメージをホワイトに変えられる起爆剤となるべく日々活動中!絶賛エンジニア募集中。
他の記事へ
2022.11.09
【11月号】先輩エンジニアが答える1年目エンジニアへのアドバイス
2022.07.22
【7月号】業界未経験の方必見!ロックシステムアカデミーオンライン始動!
2022.02.14
【2月号】コロナ禍の~働き方は~メタバース~/Youtube祝1周年!収益化までの長い道のり
2022.01.28
【動画】ReactNativeでスマホアプリ作ろう/第5回おさらいしながら天気予報機能を追加する
2021.03.26
【後編】プログラミングスクールは楽だった。ロックシステムアカデミーは苦しかった。
2017.05.04
社員の成長と会社の成長
2020.02.14