自動再生
オートコンプリート
1つ前のレクチャー
このレクチャーを完了し次に進む
Flutter初級編【質問対応無し版】
【本編・序章】オープニング
001:オープニング(本講座で作るアプリと習得できるスキルのご紹介+講座内容に不具合があることを発見された場合について) (5:40)
002-1: 【オリエン01】この講座のスライド解説資料と受講に際してのご留意事項・特典・返金対応等について (6:31)
002-2: 【オリエン02】レクチャー動画の視聴方法について(音量・速度・解像度の変更/個人メモの設定等) (2:26)
【本編・第1章】Flutterの基礎知識を身につけよう
003:Flutter(フラッター)とは(1つのプログラムがAndroidアプリにもiOSアプリにもWebアプリにもなる!) (8:53)
004:Flutterは他のマルチプラットフォームアプリ開発ツールと何が違うのか (15:00)
005:Dart(ダート・Flutterアプリを作るためのプログラミング言語)とは (6:07)
006:なぜGoogleはFlutterを開発したのか(5年先を見据えた大いなる野望?) (11:39)
第1章の確認クイズ
【本編・第2章】<初心者向け>プログラミングの基礎知識を身につけよう
007:オープニング(初心者でない方はこのセクションは飛ばして頂いて構いません) (1:15)
008:スマホとは(歴史・保有台数・市場規模) (5:04)
009:スマホ界の2大巨塔・AndroidとiOS[iphone]との違いとは (3:17)
010:アプリとは(ハードウェアとソフトウェア) (1:06)
011:プログラミングとは (2:12)
012:プログラミング処理の基本<文・関数(メソッド)・クラス> (6:59)
013:プログラミングの3ステップ(ブロック作りと同じ) (2:39)
014:プログラムがアプリになるまでの仕組み(コンパイルとビルド) (4:27)
第2章の確認クイズ
【本編・第3章】Flutterアプリを作るための道具の準備をしよう
015: オープニング(Flutterアプリを作るために必要な道具とは+環境構築Zoomライブサポート会のご案内) (5:03)
016: 【Windows】WindowsでFlutterアプリを作るための道具の説明とGitのインストールをしよう(該当者のみ) (4:39)
016-2: 【Windows】Flutterアプリの開発ツール(SDK)の設定をしよう (3:52)
016-3: 【Windows】Flutterのコマンドラインツールを使えるようにするためのパス通しをしよう (3:48)
017:【Windows】Android Studioのダウンロードとインストールをしよう (4:17)
017-1.5: 【Windows】「Classic UI」を使うための設定をしよう (8:35)
017-2: 【Windows】FlutterがAndroid Studioを正しく認識できるための設定をしよう (6:09)
018:【Windows】Androidアプリをエミュレーターで動かすための設定をしよう(Android Studio) (6:35)
019:【Windows】Androidアプリを実機で動かすための設定をしよう(Android Studio) (3:49)
020:【Mac】Flutterアプリの開発ツール(SDK)の設定をしよう (9:11)
020-2: 【Mac:Appleシリコンのみ】Rosettaのインストールをしよう (3:05)
020-3: 【Mac】Flutterのコマンドラインツールを使えるようにするためのパス通しをしよう (6:06)
020-4: 【Mac】ファンクションキーをデフォルトで使えるように設定しよう (2:31)
020-5: 【Mac:該当者のみ】Homebrewのインストールをしよう (3:54)
020-6: 【Mac:該当者のみ】CocoaPodsとGitのインストールをしよう (2:35)
021:【Mac】Android Studioのダウンロードとインストールをしよう (4:55)
021-1.5: 【Mac】「Classic UI」を使うための設定をしよう (8:35)
022:【Mac】Androidアプリをエミュレーターで動かすための設定をしよう(Android Studio) (7:16)
023:【Mac】Androidアプリを実機で動かすための設定をしよう(Android Studio) (3:01)
024:【Mac】Xcodeのダウンロードとインストールをしよう (2:51)
025:【Mac】iOSアプリをシミュレーターで動かすための設定をしよう(Xcode) (4:31)
026:【Mac】iOSアプリを実機で動かすための設定をしよう(Xcode) (12:31)
027-1: 【Windows・Mac共通】Androidエミュレーターでの日本語入力と音量調節する方法 (1:47)
027-2: 【Mac】iOSシミュレーターでの日本語入力と音量調節する方法 (1:23)
027-3: 【Windows・Mac共通】AndroidのSDKコマンドラインツールをインストールしよう (1:39)
027-4:【Windows・Mac共通】AndroidのSDKプラットフォームを使うためのライセンスに同意しよう (3:42)
027-5:【Windows・Mac共通】Android Studioの初期設定をしよう(Flutter/Dartプラグインのインストール等) (11:05)
027-6: 【Windows・Mac共通】「flutter doctor」して設定ができているか確認しよう (2:43)
【本編・第4章】はじめてのFlutterアプリを作ろう
028:オープニング(今回作るアプリの紹介[はじめてのアプリ]) (1:56)
029:Android Studioで新しいFlutterプロジェクトを作ってみよう (15:30)
030:【初心者向け解説】プロジェクトをWindowsエクスプローラーあるいはMacのFinderで見る方法 (2:34)
030-2:Flutter2.5以降は「flutter_lints」パッケージを無効化しておいてください(理由も説明しています) (7:08)
031:既に作ったプロジェクトを開いてみよう(作りかけのプロジェクトも含む) (2:39)
032:【初心者向け解説】プログラミングの天才に学ぶAndroid Studioに行く前にすべきこと(スマホアプリを作るための3ステップ) (3:41)
033:<資料>設計図(はじめてのアプリ)
034:今回作るアプリの設計図を紙に書こう(はじめてのアプリ) (3:00)
034-2: 【解説】課題アプリのサンプルプロジェクトのダウンロード方法 (7:00)
035:Flutterプロジェクトのフォルダ構造を知ろう(最低限抑えておくべき3兄弟) (13:13)
036:<資料>今回のアプリで使うリソース
037:アプリで使う画像をプロジェクトに取り込もう(小道具のプロジェクトへの取り込み方3ステップ) (9:21)
038:Flutterはどういう順番でコード書いたらええねん6ステップ (8:15)
039:アプリ全体に共通する部分(アプリのルート部分)を実装しよう (8:21)
040:【初心者向け解説】Dartプログラミングはたったの2ステップしかない! (4:59)
041:【初心者向け解説】クラスのインスタンス化(初期化)とは (8:07)
042:【初心者向け解説】Dartにおけるメソッド(関数)の作り方 (13:16)
043:【解説】Widget(ウィジェット)とは (13:35)
044: 「StatefulWidget」を使ってホーム画面の外枠を実装をしよう(import文とは) (9:18)
045:フォルダの階層構造がちゃんと見えるように「Compact Middle Packages」のチェックを外しておこう (2:52)
046:【初心者向け解説】ファイル・クラス・関数(メソッド)等の名前付けの規則 (4:00)
047:【初心者向け解説】プロジェクト内のファイル・フォルダ名の変更の仕方 (1:16)
047-2:【初心者向け解説】ソースコード内の値を検索する方法と値の名前を一括で変更する方法 (2:12)
048:「Scaffold」を使ってホーム画面をマテリアルデザイン仕様にしてアプリバーを設定しよう (13:58)
048-2: Androidエミュレーターをスタンドアロンアプリとして起動させる方法 (2:53)
048-3: 【解説】MaterialAppのtitle属性(main.dart)とAppBarのtitle属性(home_screen.dart)は何が違うのか (8:21)
048-4: 【解説】意図せざる「Hot Reload」が起こってしまうのを止める方法 (4:22)
049:【解説】Material Design(マテリアルデザイン)とは(MaterialAppの謎解き) (13:27)
050:【解説】Widgetの並べ方超基本3パターン (2:53)
051:「Column」を使ってWidgetを縦方向に並べよう (4:05)
052:「Text」を使って文字を表示させよう (5:32)
053:「Center」を使ってWidgetを中央寄せしよう (4:04)
054:「TextField」を使って文字入力欄を設置しよう (5:16)
055:「Image.asset」を使ってプロジェクトに取り込んだ画像を表示させよう (2:25)
055-2: 【解説】Android Studioで手入力せずにパスを入力できる方法(「Copy path/Reference..」の使用) (1:44)
055-3: 【初心者向け解説】パス(path)とは何か (2:54)
056: 「ElevatedButton」を使ってボタンを表示させよう(RaisedButton廃止についての説明あり) (8:18)
057:「Container」を使って画面全体に余白(padding)を作ろう (5:05)
057-2: 【解説】「PlaceHolder」とは (3:58)
058:「SizedBox」を使ってボタンを横幅いっぱいに拡げよう (4:10)
059:「Expanded」を使って画像の縦幅を残り枠いっぱいに拡げよう (3:30)
060:ボタンを押したら文字を表示させる処理を実装しよう(変数の作り方) (7:25)
061:入力欄(TextField)に入れた文字を取得して表示させよう (3:39)
062: 文字がプログラム上で本当に変わっているかどうかを確かめてみよう (1:39)
063:ボタンを押したら画像を表示させる処理を実装しよう (1:41)
064:【解説】Dartにおけるスコープ(変数・関数にアクセスできる[参照できる・使える]範囲) (7:50)
064-2: 【解説】Dartにおける「スコープ」の事例を使った説明 (2:03)
064-3: 【解説】クラスやメンバ(プロパティ・メソッド)の名前の前につく「_(アンダースコア)」の意味は何か (7:33)
064-4: 【初心者向け解説】「変数」とは(インスタンス・オブジェクト・変数・定数の違いは何か) (5:17)
064-5: 【初心者向け解説】Android Studioにおけるグローバル変数とローカル変数の見分け方 (2:27)
064-6: 【初心者向け解説】「$」とは何か(文字列の間に変数を入れる方法) (5:30)
065:「setState」メソッドを使って設定した文字・画像を画面に表示させよう(アプリの状態変化を画面に反映させる) (4:59)
066:【初心者向け解説】プログラミングにおける「=」とは(代入) (4:39)
067: 【初心者向け解説】セミコロン(;)とカンマ(,)とコロン(:)の違い (7:16)
068:アプリを動かす前にプロジェクトを一旦きれいにしよう(flutter clean) (4:01)
068-2: 【解説】「flutter clean」は内部で何をやってみるのか(Flutterプロジェクトのサイズ削減方法) (4:55)
069:ソースコードのフォーマットを整えよう(Reformat File) (4:20)
070:【Windows・Mac共通】作ったアプリをAndroidエミュレーターで動かしてみよう (5:48)
070-2: 【エラー対応】「INSTALL_FAILED_INSUFFICIENT_STORAGE」というエラーが出てAndroidエミュレーターでアプリが動かせない場合の対処法 (2:49)
070-3: 【エラー対応】「ParcelableException:・・・ Requested internal only, but not enough space」というエラーが出てAndroidエミュレーターでアプリが動かせない場合の対処法(エミュレーターのメモリを増やす方法) (3:34)
071:【Windows・Mac共通】作ったアプリをAndroid実機で動かしてみよう (2:23)
071-2: 【Windows・Mac共通(補足)】Android実機でワイアレスデバッグする方法(スマホをPCにケーブルで繋がずにデバッグする方法) (5:57)
072:【Macのみ】作ったアプリをiOSシミュレーターで動かしてみよう (1:54)
073:【Macのみ】作ったアプリをiOS実機で動かしてみよう(素晴らしきマルチプラットフォームの世界) (6:20)
073-2: 【Macのみ(補足)】なぜiOS実機で動かそうとすると毎回Xcodeが開いてしまうのか (4:23)
073-3: 【Macのみ(補足)】iOS実機でワイアレスデバッグする方法(スマホをPCにケーブルで繋がずにデバッグする方法) (2:45)
073-4: 【Macのみ】iOS14以降はデバッグモードでインストールしたアプリは端末から直接起動することはできません (3:39)
074: 【初心者向け解説】再生[Run]モードとデバッグ[Debug]モードの違い+ブレークポイントでアプリを途中で止めて変数の値を確認する方法 (4:02)
074-1.5: 【該当者のみ】ブレークポイントでアプリを止めると同じ名前の編集不能のファイルが開く場合の対処法 (5:31)
074-2: 【初心者向け解説】プログラムを1行ずつ止めながら実行する方法(Step Over / Step Into) (8:51)
075:【初心者向け解説】Flutterアプリを動かす3つのモード(Debugモード / Releaseモード / Profileモード) (4:40)
076:【+α】インターネット上の画像をアプリで表示させてみよう(Image.network) (2:24)
077:【+α】デバッグバナーを非表示にしよう (1:32)
078:【+α】アプリ全体のテーマをダークモードに変更しよう (2:14)
079:【+α】「CupertinoApp」を使ってアプリの見た目をiOS仕様に変えよう (8:07)
080:<資料>今回作ったアプリのプロジェクト(はじめてのアプリ)
第4章の確認クイズ
【本編・第5章】非同期処理と効果音を出すアプリを作ろう(ツッコミマシーン)
081:オープニング(今回作るアプリの紹介[ツッコミマシーン]) (5:33)
082:<資料>今回のアプリの設計図(ツッコミマシーン)
083:今回作るアプリの設計図を紙に書こう(ツッコミマシーン) (2:45)
084:Android Studioで今回作るアプリのプロジェクトを作ろう (5:19)
085:<資料>今回のアプリで使うリソース
086:アプリで使う効果音ファイルをプロジェクトに取り込もう (5:42)
086-2: 【解説】アプリで使うリソースをプロジェクトに取り込む際のpubspec.yamlファイルでの記述上の注意点 (3:18)
087:アプリ全体に共通する部分(アプリのルート部分)を実装しよう(main.dart) (5:52)
088:【解説】runApp関数とは (3:33)
089:【初心者向け解説】クラスの継承(extends)とメソッドのオーバーライド(override)とは (11:13)
090:【初心者向け解説】「ご先祖様」に「子孫」を代入するのはOK(プログラミングにおける「=」とは[完全版]) (2:42)
091:「StatefulWidget」を使ってホーム画面の外枠を実装をしよう(home_screen.dart) (3:45)
092:「Scaffold」を使ってホーム画面をマテリアルデザイン仕様にしてアプリバー(AppBar)を設定しよう (5:57)
093:「Column」と「Row」を使ってボタンを3行2列の碁盤の目に並べよう (9:20)
094:「Expanded」と「flex」を使って碁盤の目を画面いっぱいに均等に並べよう (5:39)
095:「CrossAxisAlignment」を使ってボタンの大きさを枠いっぱいに拡げよう (5:56)
096:「Container.padding」を使って画面全体と各枠内のボタンに余白(padding)を作ろう (5:11)
097:【初心者向け解説】「List(配列)」とジェネリクス(総称型)とは (11:09)
098:「List」を使って6つのボタンに表示させる文字をセットしよう (8:14)
098-2:【初心者向け解説】関数・メソッドの引数の名前が何でもいいのはなぜか?(引数を入れる(渡す)とはどういうことなのか?) (4:21)
099: 【解説】「パッケージ(package)」とは (4:23)
100: 【解説】Flutterアプリで音(効果音・BGM)を出す方法(just_audioパッケージの使い方(パターン①:一番シンプルな使い方)) (9:46)
101: 「just_audio」パッケージをプロジェクトに追加しよう(パッケージを使うための2ステップ) (12:53)
101-2: 【Android】64K参照制限回避のための「multiDex」有効化設定をしよう(just_audioのバージョン0.9.20以降) (9:45)
101-3: 【iOS&Appleシリコン(M1・M2)のMacのみ】「LoadError - dlopen・・・」エラーを回避するための設定をしよう (5:53)
102: 【解説】pubspec.yamlファイルとは (6:00)
103: 【解説】pubspec.lockファイルとパッケージのアップグレードとダウングレード方法 (4:17)
104: 【解説】パッケージのバージョンを指定する際に出てくる「^」とは何者なのか(バージョンコード付与の原則(Sementic Versioning)と「caret syntax」) (9:06)
104-2: 【解説】Flutter/Dartにおけるパッケージ(package)・プラグイン(plugin)・ライブラリ(library)の違いとは (9:33)
105: 【解説】なぜAudioPlayerのインスタンスは使い終わったら破棄しないといけないのか(メモリの話) (5:06)
105-2: 【解説】StatefulWidgetはどうやって状態管理をしているのか (8:18)
106: AudioPlayerクラス(just_audioパッケージ)の初期化と破棄の実装をしよう (6:49)
107: 【解説】なぜAudioPlayerの宣言文の先頭に「late」をつける必要があるのか(Null Safetyとは) (13:45)
107-2: 【解説】initState及びdisposeメソッド内で処理を書く際の注意点 (9:21)
107-3: 【解説】「assert」とは (5:02)
108: 効果音ファイルのパス(Path)をセットしよう (10:03)
109: 【初心者向け解説】ビルト・イン型クラスとは(Dartにおける2種類のクラス) (11:10)
110: 【解説】非同期処理(async-await)とは (8:30)
111: 【解説】「Future」とは (8:27)
112: 【解説】Dartでの非同期処理の使い方3原則 (10:42)
113:ボタンを押したら効果音を鳴らす処理を実装しよう (4:59)
113-2: 【解説】時間のかかる非同期処理であるsetAssetの前に「await」をつけなくても音が鳴ったのはなぜか(playメソッドの謎解き) (5:24)
114: 【解説】複数の音を同時に鳴らす方法(just_audioパッケージの使い方:パターン②) (3:07)
114-2: 複数の音を同時に鳴らせるようにパターン①のプロジェクトを変更しよう (8:03)
114-3: 【+α】「DateTime#difference」を使って音が鳴るまでのタイムラグを計測してみよう (6:39)
115: 【解説】ボタンを押してから音が鳴るまでのタイムラグをなくす方法(just_audioパッケージの使い方:パターン③) (3:22)
115-2: ボタンを押してから音が鳴るまでのタイムラグをなくせるようにパターン①のプロジェクトを変更しよう (3:34)
115-3: 【解説】initStateで非同期処理をするとなぜエラーになるのか (3:38)
115-4: initStateで非同期処理ができるようにしてアプリを動かしてみよう (3:33)
115-5: 【解説】なぜ2回目のボタン押下時には音が鳴らなかったのか (4:40)
115-6: ボタンを複数回押しても音が鳴るようにしよう(AudioPlayer#seekメソッド) (3:35)
116:【初心者向け解説】エラーはどこでわかるのか(プログラミングにおける3種類のエラー) (6:28)
117: 【初心者向け解説】「空っぽ(null)」と「空白("")」の違いとは (2:31)
118: 【解説】StatefulWidgetはなぜStateオブジェクトと別クラスで分離されているのか(Widgetの本当の正体とは) (12:28)
119: 【解説】Flutterとネイティブアプリ開発(Android/iOS)の状態管理方法比較 (6:35)
119-2: 【解説】「Flutter Gems」を使ったパッケージの見つけ方 (4:19)
119-3: 【+α:解説】pub devに公開されているパッケージの挙動確認方法(exampleモジュールにあるサンプルアプリの実行方法) (7:10)
120:【+α】ElevatedButtonをカスタマイズしてみよう(ElevatedButton.styleFromメソッドを使って) (12:21)
120-2: 【解説】Flutter3.3以降はElevatedButton.styleFromの「primary」「onPrimary」属性が非推奨になりました (3:57)
121:【+α:解説】今回の課題アプリでNull許容を適用したらどうなるか(安全呼び出し(?)と「!」演算子の実例) (3:59)
121-2: 【+α:解説】「!」演算子で強制アクセスして空っぽだった場合に何が起こるのか(Null check operator called on a null value) (3:44)
122:<資料>今回作ったアプリのプロジェクト(ツッコミマシーン)
第5章の確認クイズ
【本編・第6章】複数の画面を持つアプリを作ろう(計算脳トレ)
123:オープニング(今回作るアプリの紹介[計算脳トレ]) (5:43)
124:<資料>今回の作るアプリの設計図(計算脳トレ)
125:今回作るアプリの設計図を紙に書こう(計算脳トレ) (4:48)
126:Android Studioで今回作るアプリのプロジェクトを作ろう (4:52)
127:<資料>今回のアプリで使うリソース
128:アプリで使うリソース(画像・音)をプロジェクトに取り込もう (3:38)
129:アプリ全体に共通する部分(アプリのルート部分)を実装しよう(main.dart) (4:38)
130:[ホーム画面]外枠を実装をしよう(home_screen.dart) (3:45)
131:[ホーム画面]「SafeArea」を使ってアプリバー(AppBar)無しのレイアウトに変えよう (3:15)
132:[ホーム画面]「Column」を使ってWidgetを縦方向に並べよう (6:09)
133:[ホーム画面]「Expanded」と「Container」を使ってボタンを画面最下部中央に設置しよう (5:35)
134:[ホーム画面]「ElevatedButton.icon」を使ってボタンにアイコンをつけて見た目をカスタマイズしよう (5:44)
135:【初心者向け解説】マテリアルアイコンとは (4:08)
136:【解説】Flutterアプリにおける画面・文字の大きさの単位とは(物理ピクセルと論理ピクセル) (13:13)
137:【+α】「MediaQuery.of」メソッドを使って画面のサイズ(論理ピクセル)を取得しよう (2:30)
137-2: 【+α:解説】「MediaQuery」とは (4:22)
137-3: 【+α:解説】Flutter3.10より導入された「MediaQuery.sizeOf」等について(MediaQueryのInheritedModel化) (9:32)
137-4: 【+α:解説】動かしているアプリのWidgetの状況を確認する方法(「Flutter Inspector(Dev Tools)」の基本的な使い方) (7:22)
137-5: 【+α:解説】画面サイズの異なる端末の見た目を1つの端末で確認する方法(「device_preview」パッケージの使い方) (10:08)
138:【解説】「DropdownButton」の使い方3ステップ (2:07)
139:[ホーム画面]「SizedBox」を使ってWidget間に空白を設定しよう (6:02)
140:[ホーム画面]「DropdownMenuItem」を使って「DropdownButton」に表示させる選択肢をセットしよう(items属性) (9:43)
141:【+α】「Cascade Notation(..)」を使ってコードをシンプルにしよう (3:17)
142:[ホーム画面]「DropdownButton」で選択されたアイテムをセットしよう(value属性) (6:56)
143:【解説】なぜ「value」の後ろに「!」をつける必要があるのか(安全呼び出し(?)と「!」演算子とは) (8:05)
144:[ホーム画面]「DropdownButton」でアイテムが選択された時の処理を実装しよう(onChanged属性) (4:52)
145:【解説】onPressed/onChanged属性の中身はどうなっているのか (8:03)
145-2: 【解説】onPressed属性の「() =>」を忘れると何が起こるのか(setState() or markNeedsBuild() called during build) (6:53)
145-3: 【解説】onChanged属性に設定する関数の引数は誰がいつ渡しているのか(コールバック関数とは) (4:29)
145-4:【解説】「ValueChanged<T?>?(DropdownButton#onChanged属性)」にはなぜ「?」が2つあるのか? (3:21)
146:【解説】Flutterにおける画面遷移の方法(NavigatorとMaterialPageRoute) (8:27)
147:[ホーム画面]スタートボタンをクリックしてテスト画面を開く処理を実装しよう (7:18)
147-2: 【解説】Stateクラス(StafulWidgetの面倒を見る育ての親)ではBuildContextがどこでも使えるのはなぜか (6:56)
148:[ホーム画面・テスト画面]名前付きパラメータ(Named Parameter)を使って選択した問題数をホーム画面からテスト画面に渡そう (8:18)
149: 【解説】「required」の意味とは(Flutter2.0以降は「@required」が「required」に変更されました) (3:59)
149-2: 【解説】名前付き引数(パラメータ)とは(Named Parameters) (9:28)
150:【初心者向け解説】Flutterにおける2つの定数(「const」と「final」) (6:22)
150-2: 【初心者向け解説】「const」と「final」の違いをコードを使って説明 (3:03)
151:【初心者向け解説】「this」とは (6:57)
152:「const」を使って描画パフォーマンスを向上させよう(Flutter Performanceの使い方) (11:35)
153:【初心者向け解説】どこからでもインスタンスを経由せずに直接使えるメンバを作る2つの方法(「top-level」と「static」) (9:53)
153-2: 【初心者向け解説】「static」の解説②(「静的」と「動的」/「インスタンス変数」と「クラス変数」の違いとは) (8:21)
153-3: 【解説】トップレベル(top-level)メンバ使用上の注意点(意図せざるしてアプリが落ちるトラップが起こる可能性あり) (7:21)
154:[テスト画面]画面全体のレイアウトの枠組みを作ろう(SafeArea/Container/Column) (6:37)
155:[テスト画面]「Table」と「Center」を使ってスコア表示部分を実装しよう (13:27)
156:[テスト画面]問題表示部分を実装しよう(Expandedとflex/Container) (12:17)
157:[テスト画面]こたえ合わせボタン部分を実装しよう(ElevatedButton/SizedBox/Container) (3:35)
157-2: 【解説】「Hot Reload」と「Hot Restart(ゲジゲジor再生ボタン)」の違いとは (7:31)
157-3: 【解説】「Hot Restart」時にbuildメソッドが2回回っても気にする必要なし (4:32)
158:[テスト画面]もどるボタン部分を実装しよう(ElevatedButton/SizedBox/Container) (3:04)
159:[テスト画面]電卓ボタン部分を実装しよう(Table/Container) (8:29)
160:[テスト画面]「Stack」を使って○・☓画像とテスト終了テキスト部分のWidgetを積み重ねよう (7:39)
161:【初心者向け解説】条件分岐の「if文」と比較演算子(プログラミングは3つの流れ) (8:01)
162:[テスト画面]テスト開始前の初期設定をしよう(①:ホーム画面で選択した問題数の引き継ぎ) (6:01)
163:[テスト画面]テスト開始前の初期設定をしよう(②:効果音の準備) (9:40)
164:[テスト画面]出題処理を実装しよう(①:出題時の初期設定) (6:16)
164-2: 【初心者向け解説】if(bool型の値)はif(bool型の値 == true)と同じ意味 (1:19)
164-3: 【初心者向け解説】if(!bool型の値)はif(bool型の値 == false)と同じ意味(Dartにおける2つの「!」) (4:19)
165:[テスト画面]出題処理を実装しよう(②:乱数(Random)を使って出題) (6:45)
165-2: 【初心者向け解説】setStateメソッドの「中」で処理を書く場合と「外」で書くのでは何が違うのか(setStateメソッド使用上の留意点) (5:32)
166:[テスト画面]電卓ボタンを押す処理を実装しよう (11:20)
167:[テスト画面]こたえ合わせ処理を実装しよう(①:初期設定) (4:52)
168:【初心者向け解説】三項条件演算子(conditional expressions)とは(?/:) (3:27)
169:[テスト画面]こたえ合わせ処理を実装しよう(②:正解判定) (7:19)
169-2: [テスト画面]こたえ合わせ処理を実装しよう(②-2:正解判定時に効果音追加) (4:10)
170:[テスト画面]こたえ合わせ処理を実装しよう(③:正答率の計算) (3:36)
171:[テスト画面]こたえ合わせ処理を実装しよう(④:終了判定) (2:28)
172:[テスト画面]こたえ合わせ処理を実装しよう(⑤:「Timer」を使って1秒後に次の問題を出題) (2:53)
173:<資料>次のレクチャー(タイマー処理の解説)で使うプロジェクト
174:【解説】タイマー処理(Timer)とは (10:44)
174-2: 【解説】「Duration」クラスとは (4:23)
175:[テスト画面]もどるボタンを押したらホーム画面に戻る処理を実装しよう(Navigator.popメソッド) (6:41)
176:【+α:解説】今回の課題アプリでNull許容を適用したらどうなるか(安全呼び出し(?)と「!」演算子の実例) (1:45)
177:<資料>今回作ったアプリのプロジェクト(計算脳トレ)
第6章の確認クイズ
【本編・第7章】データベースを使うアプリを作ろう(私だけの単語帳:前編)
178:オープニング(今回作るアプリの紹介[私だけの単語帳]) (8:27)
179:<資料>今回の作るアプリの設計図(私だけの単語帳)
180:今回作るアプリの設計図を紙に書こう(私だけの単語帳) (8:07)
181:Android Studioで今回作るアプリのプロジェクトを作ろう (5:12)
182:<資料>今回の作るアプリのリソース
183:アプリで使うリソース(画像)をプロジェクトに取り込もう (4:16)
184:アプリ全体に共通する部分(アプリのルート部分)を実装しよう (3:17)
185:[ホーム画面]外枠の実装をしよう(アプリバー無しのマテリアルデザイン仕様) (2:26)
186:[ホーム画面]画面全体のレイアウトの枠組みを作ろう (5:03)
186-2: [ホーム画面]画面の背景色を変更しよう(Scaffold#backgroundColorと色の16進数) (3:56)
186-3: 【初心者向け解説】「ビット」と「バイト」と16進数との関係とは (5:56)
187:カスタムフォントの設定をしよう(カスタムフォントの使い方4ステップ) (8:37)
188:「Divider」を使って横線を引こう (6:01)
189:「VoidCallback」を使ってボタンをカスタムウィジェットで作ろう (15:25)
190:【解説】なぜButtonWithIconのコンストラクタ引数に「required」キーワードをつける必要があるのか (1:29)
191:<資料>次のレクチャー(VoidCallbackの解説)で使うプロジェクト
192:【解説】「VoidCallback」とは何か (6:12)
193:【解説】ラジオボタン(RadioListTile)の使い方4ステップ (6:31)
194:[ホーム画面]ラジオボタンの表示部分を実装しよう(title属性) (5:42)
194-2: 【+α:解説】RadioListTileのvalue属性はNull許容でないのに「null」が入れられるのはなぜか(nullとonChanged属性の正体とは?) (7:22)
195:[ホーム画面]ラジオボタンにセットする値を設定しよう(value/groupValue属性) (3:01)
196:[ホーム画面]ラジオボタンが選択されたときの処理を実装しよう(onChanged属性) (7:01)
196-2: 【解説】RadioListTile.onChanged属性の引数に型を指定した場合の対処法(Null-safety対応) (3:27)
197:[ホーム画面]単語一覧画面に遷移する処理を実装しよう (4:40)
198:[ホーム画面]テスト画面に遷移する処理を実装しよう (5:14)
199:【解説】「BuildContext」とは (15:01)
199-2: 【解説】「MaterialPageRoute」の謎解き(なぜ遷移先の画面を「child」ではなく「builder」で設定するのか) (10:18)
200:「AppBar」を使えば前の画面に戻る処理を実装する必要がない! (5:15)
201:[一覧画面]「FloatingActionButton」を使って編集画面に遷移する処理を実装しよう (10:44)
202:[編集画面]問題入力部分を実装しよう (6:32)
203:[編集画面]こたえ入力部分を実装しよう (1:46)
203-2: [編集画面]「TextEditingController」を使い終わったら破棄する処理を実装しよう (3:41)
204:[編集画面]「SingleChildScrollView」を使ってコンテンツが画面からはみ出さないようにしよう (3:09)
205:[編集画面]「WillPopScope」を使って一覧画面に戻る処理を実装しよう (11:11)
205-2: 【解説】WillPopScopeとは (6:04)
205-3: 【解説】Future.valueとは (3:10)
205-4: 【解説】なぜ「WillPopScope」の後継として「PopScope」が登場したのか(「Android Predictive Back」対応) (8:30)
205-5: 【Flutter3.16以降】「PopScope」とは(WillPopScopeとの違い) (9:41)
205-6: 【Flutter3.16以降】編集画面のWillPopScopeをPopScopeに移行させよう (7:25)
206:【初心者向け解説】データベース(Database:DB)とは (5:53)
207: 【解説】Flutter/Dartで使えるデータベース操作パッケージ「Drift(旧:Moor)」とは (7:18)
207-2: 【解説】なぜ「Moor」はパッケージ名をわざわざ「Drift」に変えたのか (6:30)
208: 【解説】データベース操作パッケージ「Drift(旧:Moor)」の使い方10ステップ (18:00)
209:【解説】pubspec.yamlファイルにおける「dependencies」と「dev_dependencies」の違いとは (5:37)
210: Drift(旧:Moor)パッケージをプロジェクトに追加しよう(Driftの使い方10ステップ①) (3:04)
210-2: 【解説】Driftを使うために必要なパッケージ群の説明(なぜ4つも必要なのか) (6:03)
210-3: x86のAndroid端末用のビルドを作成しないようにbuild.gradleファイルを修正しよう (3:20)
210-4: 【Macのみ:Drift関連】iOSでビルドしたら「C compiler cannot create executables」というエラーが出る場合の対処法 (5:48)
211: コード生成用ファイルとテーブルクラスの設定をしよう(Driftの使い方10ステップ②③) (7:28)
212:【解説】SQLiteで使えるデータの型とテーブルクラスのコードの解説 (7:54)
213:【初心者向け解説】「Set」とは (3:25)
214:【初心者向け解説】「get」とは (5:12)
215: データベースクラスの設定をしよう(Driftの使い方10ステップ④) (2:47)
216: dartコマンドを使ってDrift用のコードを生成しよう(Driftの使い方10ステップ⑤) (2:45)
216-2: (該当者のみ)Flutterを3.24にアップグレードするとコード生成に失敗する場合の対処法([SEVERE]Failed to precompile build script・・) (4:13)
216-3: 【解説】「part」とは (3:07)
217: 【解説】コード生成コマンドで出来たファイル(database.g.dart)の中身を見てみよう (3:55)
218: データベースとの接続を開始するメソッド(_openConnectionメソッド)を作成しよう(Driftの使い方10ステップ⑥) (5:02)
219: 【解説】Dartにおける7つのコンストラクタ(「:」の謎解き) (10:33)
220: 【解説】「const」キーワードのややこしさ(コンストラクタを「作る」場面(クラスの設計図)と「使う」場面(インスタンスの生成)で意味合いが異なる) (6:21)
221: データベースのスキーマバージョンを設定しよう(Driftの使い方10ステップ⑦) (1:23)
222: 【解説】「annotation:アノテーション(@)」とは (4:43)
223: 【解説】Drift2.18より導入された「Manager」とは何か (4:44)
224: データベースの4つの操作メソッド(クエリ)を作成しよう(Driftの使い方10ステップ⑧) (9:11)
225: データベースクラスのインスタンスを設定しよう(Driftの使い方10ステップ⑨) (3:40)
226: [編集画面]新しい単語をデータベースに登録する処理を実装しよう(Driftの使い方10ステップ⓾) (8:57)
226-2: 【解説】Driftを入れたらFlutterのColumnウィジェットが使えなくなってしまった場合の対処法(複数のパッケージに存在する同じ名前のクラスを使いたい場合の対処法) (5:12)
227:【解説】端末にインストールされているSQLiteデータベースの中身を見る方法(DB Browser for SQLiteの使い方) (10:55)
228:[編集画面]トーストメッセージ(FlutterToast)を使って登録完了メッセージを表示させよう(これまで使用していたToastパッケージとの違い) (7:47)
229: 【解説】例外処理とは(try~catch文) (7:01)
229-2: [編集画面]例外処理を使って単語を重複して登録しようとした際にエラーメッセージを表示させよう(Driftで重複データをチェックする方法) (4:54)
230:[一覧画面]データベースに登録した単語データを取得する処理を実装しよう (5:45)
230-2: 【+α:解説】Navigator.pushメソッドは遷移先の画面から戻ってくるのを待てる!(Navigator.pushの謎解き) (6:18)
230-3: 【+α:解説】Navigator.popメソッドは遷移元の画面へ値を渡せる!(Navigator.popの謎解き) (5:25)
231:【解説】ListViewの使い方5ステップ (4:45)
232:[一覧画面]「ListView」を使って単語の一覧リスト部分を実装しよう (4:46)
232-2: 【解説】itemBuilder属性に設定する関数の引数(BuildContextとint)は誰がいつ渡しているのか (3:34)
233:[一覧画面]「Card」と「ListTile」を使って単語の一覧リスト部分を実装しよう (9:49)
234:[一覧画面]一覧に表示された単語を長押ししたら削除する処理を実装しよう (5:18)
235:「enum(列挙型)」を使って編集ステータスの設定をし、編集画面のコンストラクタを修正しよう (6:07)
235-2: 【初心者向け解説】なぜ定数ではなく列挙型(enum)を使うのか (2:27)
236:[一覧画面]一覧に表示された単語をタップしたときに編集画面に遷移する処理を実装しよう (2:58)
237:[編集画面]一覧画面から渡された値を引き継ごう (8:49)
238:[編集画面]一覧画面で選択した単語を修正する処理を実装しよう (8:09)
第7章の確認クイズ
【本編・第8章】データベースを使うアプリを作ろう(私だけの単語帳:後編)
239: データベースにフィールド(暗記済みフラグ)を追加しよう (6:04)
239-2: database.g.dartファイルを再作成してスキーマバージョンを繰り上げよう (3:23)
240: 【解説】Driftデータベースのフィールドを空っぽOK(Nullable)にする方法 (2:24)
241:既に端末にインストールされている旧バージョンのデータベースとの統合処理を実装しよう (9:59)
242:[編集画面]データベースのフィールド追加に伴う単語の登録・修正処理を変更しよう (2:14)
243:【+α】「copyWith」メソッドを使って変更したい項目だけを簡単に修正する方法 (3:15)
244:テストの状態を管理するためのステータスを設定しよう(TestStatus) (3:15)
245:[テスト画面]画面全体のレイアウトの枠組みを作ろう (6:39)
246:[テスト画面]問題数を表示するパートを実装しよう (4:50)
247:[テスト画面]「Stack」でWidgetを重ねて問題カード表示パートを実装しよう (5:40)
248:[テスト画面]「Stack」でWidgetを重ねてこたえカード表示パートを実装しよう (3:35)
249:【解説】CheckBoxListTileの使い方3ステップ (8:48)
250:[テスト画面]「CheckBoxListTile」を使って単語を暗記済みにする場合のチェックボックスを実装しよう (6:00)
251:[テスト画面]テストで使う単語群をデータベースから取得しよう①(暗記済みの単語を除外して取得するクエリメソッドの作成) (6:32)
252:[テスト画面]テストで使う単語群をデータベースから取得しよう②(テスト画面からクエリメソッド呼び出し) (6:06)
253:[テスト画面]取得した単語リストをシャッフルしよう (5:07)
253-2: 【解説】「late」使用上の注意点(最初に使うまでに値を入れないと(初期化しないと)いけない) (9:22)
254:[テスト画面]「switch」文を使ってテストの状態を切り替える処理を実装しよう(FloatingActionButton) (6:07)
255:[テスト画面]テスト開始前の初期状態の設定をしよう (5:57)
256:[テスト画面]問題カードを出す処理を実装しよう (5:45)
256-2: [テスト画面]出すべき問題が1問もない場合に発生するエラーへの対処法(Unhandled Exception: RangeError (index)) (4:08)
256-3: 【解説】Listの要素無し判定の際に「isNotEmpty」ではなく「!=[]」ではなぜダメなのか(「==」の本当の意味とは) (7:21)
257:[テスト画面]こたえカードを出す処理を実装しよう (3:14)
258:[テスト画面]暗記済フラグをデータベースに登録しよう (5:01)
259:[テスト画面]テスト終了時にメッセージを表示させよう (6:46)
260:[一覧画面]暗記済の単語は一覧上でチェックマークを表示させよう(ListTile.trailing/Icon) (3:46)
261:[一覧画面]暗記済の単語を下にソートする処理を実装しよう①(クエリメソッドの作成) (5:21)
262:[一覧画面]暗記済の単語を下にソートする処理を実装しよう②(一覧画面からクエリメソッド呼び出しとリストの更新) (2:59)
263:<資料>次のレクチャー(AlertDialogの解説)で使うプロジェクト
264:【解説】確認ダイアログ(AlertDialog)の使い方4ステップ (8:24)
265:[一覧画面]単語削除時に確認ダイアログ(AlertDialog)を出す処理を実装しよう (10:44)
266:[編集画面]単語の登録・修正時に確認ダイアログ(AlertDialog)を表示する処理を実装しよう (11:10)
267:[テスト画面]テスト終了時の確認ダイアログを実装しよう(AlertDialog) (9:17)
268: 【Flutter3.16以降】テスト画面のWillPopScopeをPopScopeに移行させよう (3:36)
第8章の確認クイズ
【本編・第8章+α】データベースを使うアプリを作ろう(私だけの単語帳:+α集)
269: 【+α:解説】繰り返し処理とは(forループとforEach関数) (9:15)
270: 【+α:繰り返し処理①】for句を使ってみよう (7:37)
271: 【+α:繰り返し処理②】for-in句を使ってみよう (2:21)
272: 【+α:繰り返し処理③】forEach関数を使ってみよう (4:30)
273:【+α】「Radio(ラジオボタン)」を「Switch(切り替えトグル)」に変えてみよう (6:25)
274:【+α】ランチャーアイコンを作ってみよう(flutter_launcher_iconsパッケージ) (10:11)
275: 【エラー対応】「flutter_launcher_icons」パッケージでランチャーアイコンを作ると「FormatException: Invalid number」 という例外が発生してしまう場合の対処法 (1:41)
276:【+α:補足1】AndroidのランチャーアイコンをAdaptive Iconにする方法 (5:50)
277:【+α:補足2】AndroidのランチャーアイコンをAdaptiveからLegacyに戻す方法 (1:22)
278:【+α】Android端末に表示されるアプリのタイトルと画面の向きを設定しよう (3:00)
279:【+α:Macのみ】iOS端末に表示されるアプリのタイトルと画面の向き設定しよう(Xcode) (2:35)
280:【+α】Android用のスプラッシュスクリーン(ランチャースクリーン)を作ってみよう (12:42)
281:【+α:Macのみ】iOS用のスプラッシュスクリーン(ランチャースクリーン)を作ってみよう (4:08)
280-2: 【+α:解説】Android12(APIレベル31)以降のランチャースクリーンの設定方法 (8:31)
282: 【+α】SingleChileScrollViewとListViewを組み合わせる場合の注意点 (7:48)
283: 【+α】SingleChildScrollViewとExpandedは一緒に使ってはいけない(ExpandedとElexibleの違いとは) (6:38)
284:【+α:解説】今回の課題アプリでNull許容を適用したらどうなるか(安全呼び出し(?)と「!」演算子の実例) (3:05)
285:<資料>今回作ったアプリのプロジェクト(私だけの単語帳)
第8章+αの確認クイズ
【本編・最終章】本編エンディング
286:エンディングメッセージと受講生特典のご案内 (3:10)
【補足セクション①】FlutterアプリをAndroidアプリとしてリリースしよう(Google Play Console)
F101: Androidアプリの開発者登録をしよう(Google Playデベロッパーアカウント登録) (6:34)
F102: 支払いプロフィールを設定しよう(Google Play Console) (6:08)
F103: サービス手数料を15%に引き下げるための設定をしよう(アカウントグループの登録) (4:17)
F104: ターゲットAPIレベル・アプリID・アプリのバージョン設定をしよう(Android Studio) (7:40)
F104-2: 【解説】Flutter2.8以降におけるAndroidのビルドファイル(build.gradle)の各種SDKversion数値の確認方法 (5:03)
F105: 【該当者のみ】ハイフン(-)の入ったドメイン名を使う場合の注意点(「AAPT: error: attribute 'package' in tag is not a valid Android package name: ・・・'」の対処法) (4:44)
F106: 【解説】AndroidアプリのAPIレベルとは (7:29)
F107: 【解説】なぜbuild.gradleファイルは2つ存在するのか (3:23)
F108: アップロード鍵を作ってGoogle Play Consoleにアップロードするファイル(App Bundle)を作ろう(Android Studio) (8:02)
F108-2: 【+α】アップロード鍵を紛失してしまった場合の対処法(パスワード忘れ含む) (12:46)
F109: 【解説】Google Playアプリ署名(App Signing)とは (3:47)
F110: Google Play Consoleに新規アプリを追加して「ストア掲載情報」を入力しよう (3:23)
F111: アプリのアクセス権と広告に関する設定をしよう(初期設定) (3:43)
F112: コンテンツのレーティングを取得しよう(Google Play Console) (1:41)
F113: ターゲットユーザーを設定しよう(初期設定) (3:26)
F114: 【解説】13歳未満対象のアプリをリリースする際の注意点(①:新しくなったGoogle Playファミリーポリシーへの対応) (5:01)
F114-2: 【解説】13歳未満対象のアプリをリリースする際の注意点(②:対象年齢設定上の注意点と外部リンクの禁止) (5:46)
F114-3: 「ニュースアプリ」であるかどうかの設定をしよう (2:09)
F114-4: 新型コロナ(COVID-19)関連アプリであるかどうかの設定をしよう (1:53)
F114-5: 「データセーフティ(個人情報を収集するかどうか)」の設定をしよう (5:48)
F114-6: 「広告ID」の設定をしよう (3:37)
F114-7: 「金融取引機能」を提供するアプリかどうかの設定をしよう (3:24)
F114-8: 「行政アプリ」かどうかの設定をしよう (3:20)
F115: アプリのカテゴリを選択し、連絡先情報を登録しよう(初期設定) (1:41)
F116: ストアの掲載情報を設定しよう(初期設定) (6:11)
F117: 内部テストを行うためのテスターを設定しよう(アプリのリリース) (2:11)
F118: 新しいリリースを内部テスト版でリリースしよう(アプリのリリース) (2:10)
F119: 内部テスト版アプリをテストし「リリース前」レポートで問題を確認しよう(アプリのリリース) (2:37)
F120: リリース前レポートで「java.lang.StackOverflowError」というクラッシュエラーが出た場合の対処法 (3:43)
F121: テストが完了した内部テスト版を製品版としてリリースしよう(アプリのリリース) (2:07)
F121-2: 【希望者のみ】EUを配信対象から外す設定をしよう(Google Play Console) (5:14)
F122: リリースしたアプリのバージョンアップをしよう (3:47)
F123: 【重要】2020/11/2までにAndroidアプリの「targetSdkVersion」を「29」に上げる必要あり! (3:50)
F124: リリース版のアプリをGoogle Playを通さずに開発者のスマホ端末にインストールする方法 (2:49)
F125: 【2023/9以前に作成されたアカウント向け】Google Play Consoleデベロッパーアカウント確認完了期限の設定 (5:36)
F126: 【該当者のみ】法人で登録する際のDUNSナンバーの取得方法 (2:30)
F127: 【2023/9以前に作成されたアカウント向け】Google Play Consoleデベロッパーアカウントの確認方法(組織の場合) (6:28)
【補足セクション②】<Macのみ>FlutterアプリをiOSアプリとしてリリースしよう(App Store Connect)
F201: iOSアプリの開発者登録をしよう(Apple Developer Programへの登録) (7:06)
F201-2: 【該当者のみ】法人で登録する際のDUNSナンバーの取得方法 (2:30)
F202: 支払いプロフィールを設定しよう(App Store Connect) (5:42)
F202-2:【未済の方のみ】銀行口座保有人の住所登録が2021/10/22までに必要になりました(「有料App」契約をしている場合) (2:06)
F203: サービス手数料を15%に引き下げるための設定をしよう(App Store Small Business Programの申請) (3:25)
F204: バンドルIDを登録しよう(App IDs) (4:03)
F205: App Store Connectで新規アプリを追加しよう (3:45)
F206: アップロードするプロジェクトの設定を確認しよう(Xcode) (5:15)
F207: App Store Connectにアプリのファイルをアップロードしよう(XCode) (5:43)
F208: 「App情報」を入力しよう(App Store Connect) (2:19)
F209: 「価格および配信状況」の入力をしよう(App Store Connect) (1:34)
F209-2: 欧州連合デジタルサービス法のトレーダー要件の設定をしよう (6:58)
F209-3: 【トレーダーでない場合】EUを配信対象から外す設定をしよう(App Store Connect) (3:12)
F209-4: App Store Connectに載せるスクリーンショット作成時の注意点 (4:44)
F209-5: 「年齢制限指定」の設定をしよう (5:29)
F209-6: 【解説】子供向けiOSアプリ作成上の注意点 (5:36)
F210: 「プラットフォームバージョン情報」を入力しよう(App Store Connect) (6:26)
F211: TestFlightでベータ版テストをしよう(App Store Connect) (6:23)
F212: テストが完了したベータ版を製品版として審査に提出しよう(AppReview) (3:04)
F213: リリースしたアプリのバージョンをアップしよう (2:35)
【補足セクション③】あらかじめデータがセットされたデータベースを使う方法(Moor)
このセクションで使うサンプルプロジェクト
CSVファイルからあらかじめデータのセットされたSQLiteデータベースを作成する方法 (6:13)
あらかじめデータのセットされたデータベースをプロジェクトにセットしよう (4:12)
あらかじめデータのセットされたデータベースを使うためのMoorの設定をしよう (8:06)
【補足セクション④】データベースパッケージ「Moor」の「Drift」への名称変更に伴う移行方法
MoorからDriftへの移行方法(①:コマンドラインによる自動移行) (4:54)
MoorからDriftへの移行方法(②:手動での移行) (3:20)
【補足セクション⑤】「Null Safety(Null安全)」について(バージョン2.12.0以降のDartは空っぽ(null)が大キライに)
「Null Safety(Null安全)」とは (8:06)
安全呼び出し(Safe Call)と「!」演算子 (6:56)
空っぽ(null)と空文字(””)の違い (2:02)
「!」演算子で強制アクセスして空っぽだった場合に何が起こるのか(Null check operator called on null value) (3:44)
「late」使用上の注意点(最初に使うまでに値を入れないと(初期化しないと)いけない) (9:22)
【+α】ジェネリクスを使う場合のNull Safety上の注意点 (8:10)
既存のプロジェクトをNull Safety対応に移行させる方法(Migrating to null safety) (6:13)
Teach online with
115-6: ボタンを複数回押しても音が鳴るようにしよう(AudioPlayer#seekメソッド)
このレクチャーはご覧になれません。
既に登録済の場合は
ログインが必要になります。
.
コースに登録する