【カスタマイズ】作品追加・色変更・カテゴリ追加・共有文変更に挑戦する
この節で学ぶこと
前の節では、完成したNETAFLIX風アプリの全体構造を上から順番に読みました。
main() から始まり、NetflixLikeApp、NetflixShell、各画面、作品データ、詳細画面、YouTube再生、検索、共有、My Netaflix画面まで、アプリ全体がどのようにつながっているのかを整理しました。
今回の節では、完成したアプリを自分でカスタマイズしていきます。
具体的には、次の4つに挑戦します。
1. 作品を追加する
2. 色を変更する
3. カテゴリを追加する
4. 共有文を変更する
完成したコードをただ眺めるだけではなく、自分で一部を変更できるようになると、アプリ開発の理解が一気に深まります。
今回のゴール
この節のゴールは、NETAFLIX風アプリを「自分だけの動画アプリ」に近づけることです。
たとえば、次のようなカスタマイズができるようになります。
| カスタマイズ | できるようになること |
|---|---|
| 作品追加 | 自分で用意した作品データを一覧に追加できる |
| 色変更 | アプリ全体の雰囲気を変えられる |
| カテゴリ追加 | Home画面や検索で扱える分類を増やせる |
| 共有文変更 | Shareボタンで送る文章を変えられる |
この節は、これまで学んできた内容の総復習にもなります。
まず理解しておきたいこと
アプリをカスタマイズするときは、やみくもにコードを書き換えるのではなく、「どこを変えると、どこに反映されるのか」を考えることが大切です。
今回のアプリでは、特に次の4か所を意識します。
作品データを変える
↓
moviesを見る
色を変える
↓
NetflixColorsを見る
カテゴリを変える
↓
MovieItem.category や表示部分を見る
共有文を変える
↓
shareNetaflixMovieを見る
完成コード全体を読むときと同じように、まずは変更する場所を特定します。
カスタマイズ1:作品を追加する
最初に挑戦するのは、作品の追加です。
作品データは、movies というリストに入っていました。
const movies = [
MovieItem(
title: 'Squid Game',
subtitle: 'Survival thriller',
description: 'Hundreds of cash-strapped players accept a strange invitation...',
posterUrl: 'https://...',
backdropUrl: 'https://...',
youtubeVideoId: 'oqxAJKy0ii4',
matchRate: 98,
year: 2021,
rating: '18+',
seasonLabel: 'Season 1',
category: 'Thriller',
),
MovieItem(
...
),
];
この movies に MovieItem を1つ追加すると、アプリ内の複数の画面に反映されます。
作品追加が反映される場所
movies は、アプリ全体で使われています。
そのため、作品を追加すると、次のような画面に影響します。
| 画面 | 反映内容 |
|---|---|
| Home画面 | 作品リストに追加される |
| Search画面 | 検索対象に追加される |
| Clips画面 | 縦スワイプの作品に追加される |
| My Netaflix画面 | take や skip の範囲によって表示される可能性がある |
| 詳細画面 | タップすると詳細を表示できる |
1つのデータを追加するだけで、複数の画面に反映されるのがポイントです。
moviesに作品を追加
↓
Homeでも使える
↓
Searchでも使える
↓
Clipsでも使える
↓
Detailでも使える
MovieItemに必要な情報
作品を追加するときは、MovieItem に必要な項目をすべて書く必要があります。
MovieItem(
title: '',
subtitle: '',
description: '',
posterUrl: '',
backdropUrl: '',
youtubeVideoId: '',
matchRate: 0,
year: 2026,
rating: '',
seasonLabel: '',
category: '',
),
それぞれの意味は次の通りです。
| 項目 | 内容 |
|---|---|
title | 作品タイトル |
subtitle | 短い説明 |
description | 詳しい説明文 |
posterUrl | 縦長ポスター画像URL |
backdropUrl | 横長背景画像URL |
youtubeVideoId | YouTube動画ID |
matchRate | マッチ率 |
year | 公開年 |
rating | 年齢制限 |
seasonLabel | シーズン表示 |
category | カテゴリ |
required がついている項目は、省略できません。
作品を1つ追加してみる
たとえば、次のように作品を追加できます。
MovieItem(
title: 'Midnight Code',
subtitle: 'A mystery hidden inside an app',
description:
'A young developer discovers that a mysterious video app is sending messages from the future.',
posterUrl:
'https://images.unsplash.com/photo-1518709268805-4e9042af2176',
backdropUrl:
'https://images.unsplash.com/photo-1519608487953-e999c86e7455',
youtubeVideoId: 'dQw4w9WgXcQ',
matchRate: 94,
year: 2026,
rating: '13+',
seasonLabel: 'Limited Series',
category: 'Mystery',
),
これを movies の中に追加します。
追加するときは、前の MovieItem との間にカンマが必要です。
MovieItem(
title: '前の作品',
...
),
MovieItem(
title: 'Midnight Code',
...
),
Dartでは、リストの中に複数の要素を書くとき、要素同士をカンマで区切ります。
画像URLで注意すること
posterUrl と backdropUrl には、画像URLを入れます。
posterUrl: 'https://...',
backdropUrl: 'https://...',
基本的には、https:// で始まるURLを使いましょう。
おすすめ
↓
https://example.com/image.jpg
避けたい
↓
http://example.com/image.jpg
iOSでは、安全でないHTTP通信が制限されることがあります。
そのため、画像や動画リンクではHTTPSを使うのが基本です。
また、画像の向きも大切です。
| 項目 | 向いている画像 |
|---|---|
posterUrl | 縦長画像 |
backdropUrl | 横長画像 |
posterUrl は作品カードに使われるため、縦長のポスター画像が向いています。
backdropUrl は詳細画面の背景に使われるため、横長の画像が向いています。
YouTube動画IDとは?
youtubeVideoId には、YouTubeの動画IDを入れます。
youtubeVideoId: 'oqxAJKy0ii4',
YouTubeのURLが次のような形だった場合、
https://www.youtube.com/watch?v=oqxAJKy0ii4
動画IDは、この部分です。
oqxAJKy0ii4
つまり、URL全体ではなく、動画IDだけを入れます。
youtubeVideoId: 'oqxAJKy0ii4',
URL全体を入れてしまうと、YoutubePlayerController.fromVideoId で正しく再生できない場合があります。
作品追加後に確認すること
作品を追加したら、次の流れで確認します。
1. アプリを保存する
2. flutter runで起動する
3. Home画面に作品が出るか確認する
4. Search画面で検索できるか確認する
5. 作品をタップして詳細画面に進む
6. Playボタンで動画が再生されるか確認する
7. Shareボタンで共有文が作られるか確認する
作品を追加しただけでも、確認する場所はたくさんあります。
なぜなら、1つの作品データが複数画面で使われているからです。
よくあるエラー:カンマ忘れ
作品追加でよくあるのが、カンマ忘れです。
間違った例です。
MovieItem(
title: 'First Movie',
...
)
MovieItem(
title: 'Second Movie',
...
),
2つの MovieItem の間にカンマがありません。
正しくは、次のようにします。
MovieItem(
title: 'First Movie',
...
),
MovieItem(
title: 'Second Movie',
...
),
リストの中では、要素同士をカンマで区切る。
これはDartでとても大切な基本です。
よくあるエラー:required項目の書き忘れ
MovieItem では、すべての項目に required がついています。
const MovieItem({
required this.title,
required this.subtitle,
required this.description,
required this.posterUrl,
required this.backdropUrl,
required this.youtubeVideoId,
required this.matchRate,
required this.year,
required this.rating,
required this.seasonLabel,
required this.category,
});
そのため、1つでも書き忘れるとエラーになります。
たとえば、category を忘れると、次のような考え方のエラーになります。
categoryが必要なのに渡されていません
新しい作品を追加するときは、既存の MovieItem をコピーしてから中身だけ変更すると安全です。
カスタマイズ2:色を変更する
次に、アプリ全体の色を変更してみます。
このアプリでは、色を NetflixColors にまとめています。
class NetflixColors {
static const black = Color(0xFF000000);
static const red = Color(0xFFE50914);
static const white = Color(0xFFFFFFFF);
static const darkGray = Color(0xFF181818);
static const mediumGray = Color(0xFF2B2B2B);
}
色を1か所にまとめておくと、アプリ全体の雰囲気を変えやすくなります。
NetflixColorsの役割
NetflixColors は、このアプリでよく使う色をまとめたクラスです。
| 色 | 使われる場所 |
|---|---|
black | 画面背景 |
red | アクセントカラー |
white | 文字色 |
darkGray | カード背景 |
mediumGray | 補助背景・ボタンなど |
たとえば、背景色は次のように使われています。
backgroundColor: NetflixColors.black,
赤いボタンやアクセントには、次のように使います。
color: NetflixColors.red,
つまり、NetflixColors.red を変えると、赤を使っている部分の雰囲気が変わります。
色を青系に変更してみる
たとえば、赤を青に変更したい場合は、次のようにします。
変更前です。
static const red = Color(0xFFE50914);
変更後です。
static const red = Color(0xFF1E88E5);
変数名は red のままですが、中身は青になります。
ただし、分かりやすくするなら、名前も変えた方が自然です。
static const accent = Color(0xFF1E88E5);
その場合、コード内の NetflixColors.red を NetflixColors.accent に置き換える必要があります。
初学者はまず中身だけ変える
初心者の段階では、まず変数名はそのままで、中身の色だけ変えるのがおすすめです。
static const red = Color(0xFF1E88E5);
なぜなら、変数名まで変えると、コード内のすべての使用箇所も変更する必要があるからです。
色の値だけ変える
↓
簡単
変数名も変える
↓
使っている場所も全部変える必要がある
慣れてきたら、red ではなく accent のような名前に変えて、より分かりやすい設計にしていきましょう。
Colorの書き方
Flutterでは、色を次のように書きます。
Color(0xFFE50914)
この 0xFFE50914 は、色を表す16進数です。
構造は次のように考えます。
0xFF E5 09 14
↑ ↑ ↑ ↑
| | | |
透明度 赤 緑 青
最初の FF は、透明度です。
FF は完全に不透明という意味です。
その後の E50914 が色の部分です。
E5 = 赤成分
09 = 緑成分
14 = 青成分
Webデザインでよく見る #E50914 に、透明度の FF を前につけると、Flutterの色指定になります。
#E50914
↓
0xFFE50914
背景色を少し変えてみる
背景の黒を少し柔らかい黒にしたい場合は、次のように変えられます。
変更前です。
static const black = Color(0xFF000000);
変更後です。
static const black = Color(0xFF0B0B0F);
完全な黒よりも少しだけ柔らかい印象になります。
#000000
↓
強い黒
#0B0B0F
↓
少し柔らかい黒
動画アプリでは、背景が暗い方が映像やポスターが目立ちます。
ただし、真っ黒だと少し強く見える場合もあるため、少しだけ色を入れた黒にするのもよい方法です。
カード背景色を変えてみる
カード背景は、darkGray にまとめています。
static const darkGray = Color(0xFF181818);
これを少し明るくしたい場合は、次のようにします。
static const darkGray = Color(0xFF202020);
少しだけ明るくなることで、カードが背景から分かりやすくなります。
背景:黒
カード:少し明るい黒
↓
カードの形が見えやすい
検索結果カード、My Netaflixのメニューカードなどに影響します。
色変更後に確認すること
色を変えたら、次の画面を確認します。
Home画面
Search画面
Clips画面
My Netaflix画面
詳細画面
色はアプリ全体に影響するため、1つの画面だけ見て終わらないようにします。
特に確認したいのは、文字が読めるかどうかです。
背景色を変える
↓
文字が読みにくくなることがある
↓
白文字とのコントラストを確認する
デザインでは、かっこよさだけでなく、読みやすさも大切です。
ここまでのまとめ
ここまでで、前半として「作品追加」と「色変更」を学びました。
大切なポイントは次の通りです。
- 作品を追加するときは、
moviesにMovieItemを追加する。 moviesは、Home、Search、Clips、My Netaflix、Detailなど複数画面で使われる。MovieItemには、タイトル、説明文、画像URL、YouTube動画ID、カテゴリなどをすべて書く。- 作品追加では、カンマ忘れに注意する。
requiredの項目を書き忘れるとエラーになる。- 画像URLは、できるだけ
https://を使う。 posterUrlは縦長画像、backdropUrlは横長画像が向いている。youtubeVideoIdには、YouTube URL全体ではなく動画IDだけを入れる。- 色は
NetflixColorsにまとめている。 - 色を1か所にまとめると、アプリ全体の雰囲気を変更しやすい。
- 初学者は、まず変数名はそのままで、
Color(0xFF...)の中身だけ変えると安全。 - Flutterの色指定は、Webの
#E50914に透明度FFをつけて0xFFE50914のように書く。 - 色変更後は、全画面で文字の読みやすさを確認する。
カスタマイズ3:カテゴリを追加する
ここからは、後半として「カテゴリ追加」と「共有文変更」に挑戦します。
まずは、カテゴリを追加します。
今回のアプリでは、作品ごとに category がありました。
category: 'Thriller',
このカテゴリは、作品のジャンルや分類を表す情報です。
たとえば、次のようなカテゴリを作れます。
Thriller
Mystery
Comedy
Drama
Anime
Documentary
Action
Fantasy
カテゴリを工夫すると、Home画面の表示やSearch画面の検索が、よりアプリらしくなります。
MovieItemのcategoryを確認する
MovieItem には、次のプロパティがあります。
final String category;
そして、作品データでは次のように指定しています。
MovieItem(
title: 'Squid Game',
subtitle: 'Survival thriller',
description: 'Hundreds of cash-strapped players accept a strange invitation...',
posterUrl: 'https://...',
backdropUrl: 'https://...',
youtubeVideoId: 'oqxAJKy0ii4',
matchRate: 98,
year: 2021,
rating: '18+',
seasonLabel: 'Season 1',
category: 'Thriller',
),
この category を変えることで、作品の分類を変更できます。
category: 'Mystery',
category: 'Anime',
category: 'Documentary',
カテゴリを変えると検索にも影響する
Search画面では、カテゴリも検索対象に含めていました。
final category = movie.category.toLowerCase();
return title.contains(keyword) ||
subtitle.contains(keyword) ||
description.contains(keyword) ||
category.contains(keyword);
つまり、category: 'Anime' の作品を追加すると、Search画面で anime と入力したときに検索結果に出るようになります。
category: 'Anime'
↓
Search画面で anime と入力
↓
その作品が表示される
カテゴリは、表示用の情報であると同時に、検索にも使える情報です。
カテゴリ名を日本語にしてみる
カテゴリは英語でも日本語でも使えます。
たとえば、次のようにできます。
category: 'ミステリー',
category: 'アニメ',
category: 'ドキュメンタリー',
Search画面でも、日本語で検索できるようになります。
category: 'アニメ'
↓
Search画面で「アニメ」と入力
↓
該当作品が表示される
ただし、英語カテゴリと日本語カテゴリが混ざると、検索する側が少し迷うことがあります。
授業用や日本語アプリとして作るなら、カテゴリ名は日本語にそろえるのもよい方法です。
カテゴリをHome画面に表示する
カテゴリをデータとして持っているだけでなく、画面に表示することもできます。
たとえば、詳細画面や検索結果カードで、カテゴリを表示できます。
検索結果カードのメタ情報は、現在このようになっています。
Text(
'${movie.matchRate}% Match • ${movie.year} • ${movie.rating}',
style: TextStyle(
color: NetflixColors.white.withValues(alpha: 0.72),
fontSize: 12,
fontWeight: FontWeight.w700,
),
),
ここにカテゴリを追加すると、次のようになります。
Text(
'${movie.matchRate}% Match • ${movie.year} • ${movie.rating} • ${movie.category}',
style: TextStyle(
color: NetflixColors.white.withValues(alpha: 0.72),
fontSize: 12,
fontWeight: FontWeight.w700,
),
),
表示例は次のようになります。
98% Match • 2021 • 18+ • Thriller
カテゴリが表示されると、ユーザーは作品の雰囲気をすぐに判断しやすくなります。
カテゴリ別の作品リストを作る
少し発展として、カテゴリごとの作品リストを作ることもできます。
たとえば、Thriller だけを取り出す場合は、次のように書けます。
final thrillerMovies = movies.where((movie) {
return movie.category == 'Thriller';
}).toList();
この thrillerMovies を ContentRow に渡します。
ContentRow(items: thrillerMovies)
すると、Thriller カテゴリの作品だけが横並びで表示されます。
movies全体
↓
categoryがThrillerの作品だけ取り出す
↓
ContentRowで表示
Home画面をカテゴリ別に分けたいときに使えます。
カテゴリ別表示のコード例
Home画面で、カテゴリ別の行を作るなら、次のようにできます。
final thrillerMovies = movies.where((movie) {
return movie.category == 'Thriller';
}).toList();
final mysteryMovies = movies.where((movie) {
return movie.category == 'Mystery';
}).toList();
そして、画面側で次のように表示します。
RowTitle(title: 'Thriller'),
const SizedBox(height: 12),
ContentRow(items: thrillerMovies),
const SizedBox(height: 26),
RowTitle(title: 'Mystery'),
const SizedBox(height: 12),
ContentRow(items: mysteryMovies),
これにより、Home画面を次のような構成にできます。
Thriller
[作品] [作品] [作品]
Mystery
[作品] [作品] [作品]
動画アプリらしい見せ方になります。
日本語カテゴリで絞り込む場合
日本語カテゴリを使う場合も、考え方は同じです。
final animeMovies = movies.where((movie) {
return movie.category == 'アニメ';
}).toList();
表示するときは、次のようにできます。
RowTitle(title: 'アニメ'),
const SizedBox(height: 12),
ContentRow(items: animeMovies),
カテゴリ名を日本語にすれば、日本語ユーザー向けのアプリに近づきます。
よくあるつまずき:カテゴリ名の表記ゆれ
カテゴリでよくある問題が、表記ゆれです。
たとえば、次のように書いてしまう場合です。
category: 'Anime',
category: 'anime',
category: 'アニメ',
これらは、人間には似て見えますが、コード上では別の文字列です。
Anime
anime
アニメ
↓
すべて別扱い
カテゴリで絞り込む場合は、表記をそろえましょう。
category: 'Anime',
または、日本語で統一します。
category: 'アニメ',
カスタマイズ4:共有文を変更する
次に、共有文を変更します。
共有処理は、shareNetaflixMovie にまとめていました。
Future<void> shareNetaflixMovie({
required BuildContext context,
required MovieItem movie,
}) async {
await SharePlus.instance.share(
ShareParams(
text:
'NETAFLIXで「${movie.title}」をチェック!\nhttps://www.youtube.com/watch?v=${movie.youtubeVideoId}',
subject: movie.title,
sharePositionOrigin: shareOriginFromContext(context),
),
);
}
この中の text を変更すると、Shareボタンで送る文章を変えられます。
共有文の基本構造
現在の共有文は、次のようになっています。
text:
'NETAFLIXで「${movie.title}」をチェック!\nhttps://www.youtube.com/watch?v=${movie.youtubeVideoId}',
実際に共有される文章は、たとえば次のようになります。
NETAFLIXで「Squid Game」をチェック!
https://www.youtube.com/watch?v=oqxAJKy0ii4
${movie.title} の部分には作品タイトルが入ります。
${movie.youtubeVideoId} の部分にはYouTube動画IDが入ります。
\nで改行する
共有文の中にある \n は、改行を表します。
'NETAFLIXで「${movie.title}」をチェック!\nhttps://www.youtube.com/watch?v=${movie.youtubeVideoId}'
\n があることで、共有文は2行になります。
NETAFLIXで「作品名」をチェック!
https://www.youtube.com/watch?v=動画ID
文章とURLを別の行にしたいときに便利です。
共有文にカテゴリを追加する
共有文にカテゴリを追加してみましょう。
変更前です。
text:
'NETAFLIXで「${movie.title}」をチェック!\nhttps://www.youtube.com/watch?v=${movie.youtubeVideoId}',
変更後です。
text:
'NETAFLIXで「${movie.title}」をチェック!\nカテゴリ:${movie.category}\nhttps://www.youtube.com/watch?v=${movie.youtubeVideoId}',
共有される文章は、次のようになります。
NETAFLIXで「Squid Game」をチェック!
カテゴリ:Thriller
https://www.youtube.com/watch?v=oqxAJKy0ii4
カテゴリが入ることで、受け取った人が作品の雰囲気を少し理解しやすくなります。
共有文に説明文を追加する
さらに、作品説明文も入れられます。
text:
'NETAFLIXで「${movie.title}」をチェック!\n${movie.description}\nhttps://www.youtube.com/watch?v=${movie.youtubeVideoId}',
ただし、説明文が長すぎると、共有メッセージも長くなります。
長い共有文
↓
読む前に離脱されやすい
短い共有文
↓
見やすい
そのため、共有文には subtitle くらいの短い説明を使うのもおすすめです。
text:
'NETAFLIXで「${movie.title}」をチェック!\n${movie.subtitle}\nhttps://www.youtube.com/watch?v=${movie.youtubeVideoId}',
共有文を日本語向けにする
日本語アプリとして見せたい場合は、共有文も日本語らしく整えます。
text:
'気になる作品を見つけました。\n「${movie.title}」\nジャンル:${movie.category}\n予告編はこちら\nhttps://www.youtube.com/watch?v=${movie.youtubeVideoId}',
共有される文章は、次のようになります。
気になる作品を見つけました。
「Squid Game」
ジャンル:Thriller
予告編はこちら
https://www.youtube.com/watch?v=oqxAJKy0ii4
少し自然な文章になります。
subjectも変更できる
共有処理では、subject も指定しています。
subject: movie.title,
subject は、メールなどで件名として使われることがあります。
これを次のように変えることもできます。
subject: 'おすすめ作品:${movie.title}',
ただし、LINEやSNSなど、共有先によっては subject が表示されない場合もあります。
そのため、必ず伝えたい内容は text に入れておきましょう。
共有文変更後に確認すること
共有文を変えたら、次の場所から確認します。
詳細画面のShareボタン
Clips画面のShareボタン
shareNetaflixMovie を共通関数にしているので、1か所変更すると複数の画面に反映されます。
shareNetaflixMovieを変更
↓
詳細画面のShareに反映
↓
Clips画面のShareに反映
これは、共通化の大きなメリットです。
カスタマイズ全体の考え方
ここまでで、作品追加、色変更、カテゴリ追加、共有文変更を見てきました。
大切なのは、「どこを変えると、どこに反映されるか」を考えることです。
| 変えたいこと | 変更する場所 |
|---|---|
| 作品を増やしたい | movies |
| 色を変えたい | NetflixColors |
| カテゴリを変えたい | MovieItem.category |
| 共有文を変えたい | shareNetaflixMovie |
| Homeの作品行を変えたい | ContentRow やHome画面 |
| 検索対象を増やしたい | filteredMovies |
この対応関係が分かると、自分でカスタマイズできる範囲が広がります。
よくあるつまずきポイント
Q. 作品を追加したのに画面に出ません。
まず、movies の中に正しく追加されているか確認します。
const movies = [
MovieItem(...),
MovieItem(...),
MovieItem(...),
];
次に、その画面が movies を表示しているか確認します。
My Netaflix画面のように、take(4) で先頭4件だけ表示している場合、追加した位置によっては表示されないことがあります。
final watchingMovies = movies.take(4).toList();
この場合、5件目以降に追加した作品は、watchingMovies には出ません。
Q. 色を変えたのに一部しか変わりません。
コード内で、直接 Color(...) を書いている場所があるかもしれません。
color: Color(0xFFE50914),
このように直接色を書いていると、NetflixColors.red を変えても反映されません。
できるだけ共通色を使いましょう。
color: NetflixColors.red,
Q. カテゴリ検索がうまくいきません。
カテゴリが検索対象に入っているか確認してください。
final category = movie.category.toLowerCase();
category.contains(keyword)
また、カテゴリ名の表記ゆれにも注意します。
Anime
anime
アニメ
↓
別の文字列として扱われる
Q. 共有文に変数がそのまま表示されます。
文字列の中で変数を使うときは、${} を使います。
正しい例です。
'「${movie.title}」をチェック!'
間違った例です。
'「movie.title」をチェック!'
この場合、movie.title という文字がそのまま表示されてしまいます。
チャレンジ
チャレンジ1:新しい作品を1つ追加しよう
movies に、新しい MovieItem を1つ追加してください。
MovieItem(
title: 'Midnight Code',
subtitle: 'A mystery hidden inside an app',
description:
'A young developer discovers that a mysterious video app is sending messages from the future.',
posterUrl:
'https://images.unsplash.com/photo-1518709268805-4e9042af2176',
backdropUrl:
'https://images.unsplash.com/photo-1519608487953-e999c86e7455',
youtubeVideoId: 'dQw4w9WgXcQ',
matchRate: 94,
year: 2026,
rating: '13+',
seasonLabel: 'Limited Series',
category: 'Mystery',
),
追加後、Home画面とSearch画面で確認しましょう。
チャレンジ2:アクセントカラーを青にしよう
NetflixColors の赤色を変更してください。
変更前です。
static const red = Color(0xFFE50914);
変更後です。
static const red = Color(0xFF1E88E5);
アプリ内の赤い部分が青系に変わるか確認しましょう。
チャレンジ3:カテゴリを日本語にしよう
作品データのカテゴリを日本語に変更してみましょう。
category: 'Mystery',
変更後です。
category: 'ミステリー',
Search画面で「ミステリー」と検索して、該当作品が出るか確認してください。
チャレンジ4:共有文にカテゴリを追加しよう
shareNetaflixMovie の text を変更してください。
変更前です。
text:
'NETAFLIXで「${movie.title}」をチェック!\nhttps://www.youtube.com/watch?v=${movie.youtubeVideoId}',
変更後です。
text:
'NETAFLIXで「${movie.title}」をチェック!\nカテゴリ:${movie.category}\nhttps://www.youtube.com/watch?v=${movie.youtubeVideoId}',
Shareボタンを押して、共有文にカテゴリが入るか確認しましょう。
チャレンジの答え
チャレンジ1の答え
movies の中に、次のように追加します。
MovieItem(
title: 'Midnight Code',
subtitle: 'A mystery hidden inside an app',
description:
'A young developer discovers that a mysterious video app is sending messages from the future.',
posterUrl:
'https://images.unsplash.com/photo-1518709268805-4e9042af2176',
backdropUrl:
'https://images.unsplash.com/photo-1519608487953-e999c86e7455',
youtubeVideoId: 'dQw4w9WgXcQ',
matchRate: 94,
year: 2026,
rating: '13+',
seasonLabel: 'Limited Series',
category: 'Mystery',
),
前後の MovieItem とカンマで区切ることを忘れないようにします。
チャレンジ2の答え
変更前です。
static const red = Color(0xFFE50914);
変更後です。
static const red = Color(0xFF1E88E5);
変数名は red のままですが、実際の色は青になります。
チャレンジ3の答え
変更前です。
category: 'Mystery',
変更後です。
category: 'ミステリー',
Search画面で「ミステリー」と入力すると、該当作品が表示されます。
チャレンジ4の答え
変更前です。
text:
'NETAFLIXで「${movie.title}」をチェック!\nhttps://www.youtube.com/watch?v=${movie.youtubeVideoId}',
変更後です。
text:
'NETAFLIXで「${movie.title}」をチェック!\nカテゴリ:${movie.category}\nhttps://www.youtube.com/watch?v=${movie.youtubeVideoId}',
共有文にカテゴリが追加されます。
この節のまとめ
この節では、完成したNETAFLIX風アプリを自分でカスタマイズする方法を学びました。
大切なポイントは次の通りです。
- カスタマイズでは、「どこを変えると、どこに反映されるか」を考える。
- 作品を追加したい場合は、
moviesにMovieItemを追加する。 MovieItemには、必要な項目をすべて書く。- 作品追加では、カンマ忘れと
required項目の書き忘れに注意する。 - 画像URLは、できるだけ
https://を使う。 youtubeVideoIdには、YouTube URL全体ではなく動画IDだけを入れる。- 色を変えたい場合は、
NetflixColorsを変更する。 - 初学者は、まず変数名は変えず、
Color(0xFF...)の中身だけ変えると安全。 - カテゴリは
MovieItem.categoryで管理している。 - カテゴリは検索対象にもできる。
- カテゴリ名は表記ゆれに注意する。
- カテゴリ別に作品を表示したい場合は、
whereで絞り込む。 - 共有文は
shareNetaflixMovieのtextを変更する。 - 文字列の中に変数を入れるときは
${movie.title}のように書く。 \nを使うと、共有文の中で改行できる。- 共通関数を変更すると、複数画面に一括で反映される。
次のステップ
次の節では、完成したアプリを実機やシミュレーターで動かしながら、確認すべきポイントを整理します。
Home、Search、Clips、My Netaflix、詳細画面、YouTube再生、共有、アプリアイコンなどを順番に確認し、提出前・発表前のチェックリストとして使える形にまとめます。
