-
Notifications
You must be signed in to change notification settings - Fork 0
DNET_FlutterFirstStep
-
戻る
- Flutterのファースト・ステップ(本ページ)
- Flutterのセカンド・ステップ
- Flutterのサード・ステップ
- Flutterの4thステップ
- Flutterの5thステップ
- ...Flutterのファースト・ステップ2
Flutter の step by step(其の一)。
コチラ(の該当節)を参考にして実施
https://flutter.dev/docs/get-started/install/windows
flutter_windows_x.x.x-stable.zip
-
解凍
C:\prog\dev\flutter -
パス指定
// ユーザーの環境変数に設定する例 $path =[System.Environment]::GetEnvironmentVariable('PATH','User') $path +=";" + "C:\prog\dev\flutter\bin"; [System.Environment]::SetEnvironmentVariable('PATH',$path,'User')
以下のCommandを実行し、TODOを確認する。
>flutter doctor
-
Android Studioのインストール(Android Studioの該当節を参照)
-
既定値でインストール(Android Virtual Device(AVD)もインストール)。
-
最後に、ライセンス条項に同意する。
flutter doctor --android-licenses -
初期設定(Android Studioの該当節を参照)
- 必要に応じて、Android Targetをインストール
- 日本語化したら問題が出るらしい(現時点で解決しているか不明)。
-
PATH環境変数(Android Studioの該当節を参照)
-
ツール類
%USERPROFILE%\AppData\Local\Android\Sdk\tools %USERPROFILE%\AppData\Local\Android\Sdk\tools\bin %USERPROFILE%\AppData\Local\Android\Sdk\platform-tools -
gradleのbin
%USERPROFILE%\.gradle\wrapper\dists\gradle-6.7-all\cuy9mc7upwgwgeb72wkcrupxe\gradle-6.7\bin
※ 前述のPowerShellだと、%USERPROFILE%が展開されねぇんだけど...。
-
「File」メニュー -> 「Settings..」 -> 「Plugins」
- Flutterプラグインの「Install」ボタンを押下
- Dartプラグインの「Install」ボタンを押下
以下のCommandを実行し、問題が無いことを確認する。
>flutter doctor
Doctor summary (to see all details, run flutter doctor -v):
[√] Flutter (Channel stable, 2.0.3, on Microsoft Windows [Version
10.0.19041.867], locale ja-JP)
[√] Android toolchain - develop for Android devices (Android SDK version 30.0.3)
[√] Chrome - develop for the web
[√] Android Studio (version 4.1.0)
[√] VS Code, 64-bit edition (version 1.47.2)
[√] Connected device (2 available)
• No issues found!
>
SDKのパスを変更する場合、以下の手順に従って変更する。
- Flutter SDKのPathを変えた時にやること【Flutter】 - Qiita
https://qiita.com/umi_mori/items/46073f5bfb88348efd16
Android Studioで、新規作成プロジェクトする。
-
「Start Flutter New Project」
or 「File -> New -> New Flutter Project..」 -
「Flutter Application」を選択
| プロジェクトタイプ | 概要 |
|---|---|
| Flutter Application | アプリケーション用 |
| Flutter Plugin Android | ネイティブAPI用ライブラリ用 |
| Flutter Package | 画面部品用 |
| Flutter Module | Dartライブラリ用 |
- 以下を入力する。
| 入力項目 | 概要 |
|---|---|
| Project Name | プロジェクト名 |
| Flutter SDK path Project location | Flutter SDKをインストールしたフォルダを指定。 |
| Description | プロジェクト、アプリの説明 |
| Package Name | 通常、ドメインを反対にした値を入力 |
- コチラ(の該当節)のコードが生成される。
- 実行するデバイスでChromeなどのブラウザを選択し、
- 緑三角(実行)、虫(デバッグ)ボタンを押すと実行。
- ブラウザではなく、エミュレータや実機を使う手順はコチラ。
以降の手順で説明する。
Android Studioで1GB、エミュレータで6GB程、メモリを消費するので、
開発機のメモリが16GB程度では少々、スペック不足、故に実機でのデバッグを行うことになる。
-
必要に応じて、Windows ハイパーバイザー プラットフォーム(Androidのエミュレータの該当節を参照)を有効化しておく。
(コレにより、Hyper-V、Docker for Windows、WSL2との同居が可能に) -
コチラ(の「AVDエミュレータ作成」)の新し目の手順になる。
-
エミュレータの登録
- 「Tools」メニュー -> 「AVD Manager」
- (「Create Virtual Device ..」でデバイスを選択し「Next」ボタンを押下)
- (API Levelを選択(最新に近いモノを選択する))
- 「Actions」から三角ボタンを押して、エミュレータを起動
-
エミュレータでデバッグ実行
- 実行するデバイスを選択し、
- 緑三角(実行)、虫(デバッグ)ボタンを押すと実行。
-
-
IDEサポート(Flutter - ビルドとデプロイの該当節を参照)
最近の開発環境では、IDEサポートが追加されている。 -
マニュアル
-
「Build」メニュー -> 「Flutter」 -> 「Build APK」
を実行して、apkファイルをプロジェクト出力。 -
コチラ(の該当節)の手順を参考にして、以下のフォルダのapkファイルを送り込む。
%HOMEPATH%\AndroidStudioProjects\(flutter_app)\build\app\outputs\flutter-apk\app-release.apk※ コマンドの実行に、PATH環境変数の設定は必須。
-
- 「Tools」メニュー -> 「Flutter」 -> 「Open Flutter Devtools」を実行して、
- デバッグ実行中に、[Flutter Inspector]のペインを開くとUI要素のツリーが表示される。

- Flutter Devtoolsでは、その他、様々なツールを使用できる。
- Timeline
- Memory
- Performance
- Debugger
- Logging
-
外部デザイナとして、Flutter Studioがある。
- AppBuilder 2
https://flutterstudio.app/
- AppBuilder 2
-
加えて、
- Flutter Inspectorと、
- Widget等の追加、削除+Hot Reload
を併用すると、RAD風に開発できる。
-
参考
- 開発効率が上がるFlutter x Android StudioのTips集 - Qiita
https://qiita.com/akatsuki174/items/d66fa84fe51aa2d9a1a6
- 開発効率が上がるFlutter x Android StudioのTips集 - Qiita
- 以下のようなボタンがある。
- 「() {}」(空のラムダ式)を、
生成されたコード中にある、
「_incrementCounter」に変更してテスト可能。
- onPressedに、任意のメソッドを書く。
- deprecatedらしい→ElevatedButton
RaisedButton(
child: const Text('Button'),
color: Colors.orange,
textColor: Colors.white,
onPressed: () {},
),onPressedに、任意のメソッドを書く。
ElevatedButton(
child: const Text('Button'),
style: ElevatedButton.styleFrom(
primary: Colors.orange,
onPrimary: Colors.white,
),
onPressed: () {},
),- onPressedに、任意のメソッドを書く。
- deprecatedらしい→TextButton
FlatButton(
child: const Text('Button'),
textColor: Colors.black,
onPressed: () {},
),onPressedに、任意のメソッドを書く。
TextButton(
child: const Text('Button'),
style: TextButton.styleFrom(
primary: Colors.black,
),
onPressed: () {},
),- onPressedに、任意のメソッドを書く。
- deprecatedらしい→OutlinedButton
OutlineButton(
child: const Text('Button'),
onPressed: () {},
),onPressedに、任意のメソッドを書く。
OutlinedButton(
child: const Text('Button'),
style: OutlinedButton.styleFrom(
primary: Colors.black,
),
onPressed: () {},
),未記載(元 Wiki も見出しのみ)。
未記載(元 Wiki も見出しのみ)。
未記載(元 Wiki も見出しのみ)。
未記載(元 Wiki も見出しのみ)。
- 参考
- 【Flutter】ドロップダウンボタンを表示する | スクリプちん
https://dtpscriptin.com/flutter-dropdownbutton/ - Flutterで2つのDropdownButtonを使う - Qiita
https://qiita.com/bigface00/items/c0fad7b0e94869d1c609
- 【Flutter】ドロップダウンボタンを表示する | スクリプちん
ボタンでない、任意のWidgetに、イベントを実装できる。
簡単に、Ripple エフェクトを付ける事が出来る。
Material( // 親にMaterialが必須
color: Colors.blue, // Material自体は青を指定
child: Center( //
child: Ink( // ここをContainerにするとsplashが効かないので、Inkに変える
color: Colors.yellow, // 背景色はここで指定
width: 200.0,
height: 100.0,
child: InkWell(
onTap: () {},
child: Center(child: Text('YELLOW'))
),
),
),
)InkWellのRipple エフェクトは無いが、
他のイベント(ジェスチャー)にも反応する。
GestureDetector(
// タッチ検出対象のWidget
child: Text(
'How to use GestureDetector',
textAlign: TextAlign.center,
overflow: TextOverflow.ellipsis,
style: TextStyle(fontWeight: FontWeight.bold),
),
// ダブルタップ
onDoubleTap: _incrementCounter
)- [Flutter]コピペで使える!ボタンのデザイン16種類をまとめました
https://zenn.dev/coka01/articles/cb0b632766138e9858e7 - Flutter: InkWell vs GestureDetector: what is the difference? - Stack Overflow
https://stackoverflow.com/questions/56725308/flutter-inkwell-vs-gesturedetector-what-is-the-difference
- Flutter:Widget一覧 > Material Components > Buttons
https://qiita.com/matsukatsu/items/e289e30231fffb1e4502#buttons - Flutter でよく使う(と思う)コードまとめ > イベント
https://qiita.com/chooyan_eng/items/e7f1fcca1eeb0cf150b5
- 画面遷移の実装について。
- MaterialApp以下で実装。
- MaterialApp が持っている Navigator を使って画面遷移。
- Navigatorの動作イメージはStackで、一番上の Route が現在の画面。
- 無限にPushできてしまうので、実装を考える必要がある。
- 常にPoP & Pushだと、戻った時に、常に状態は保存されていない。
- ...
-
Widget を MaterialPageRoute に渡して Route を作る。
-
Navigator.pushにRouteを渡して画面遷移。
Navigator.of(context).pop();
Navigator.of(context).push(
MaterialPageRoute(
builder: (context) {
return MyHomePage(title: 'Flutter Demo Home PageA');
},
),
);-
予め MaterialApp に Routes を登録しておく。
Widget build(BuildContext context) { return MaterialApp( title: 'Flutter Demo', theme: ThemeData( ... ), routes: { '/': (context) => MyHomePage(title: 'Flutter Demo Home Page'), '/message': (context) => MessageView(),
-
Navigator.pushNamedにルート名を渡して画面遷移。
Navigator.of(context).pushNamed("/message");
Navigator.pushNamed(context, '/message', arguments: ...);
-
以下を参考に、AppBarのactions:
- IconButtonのonPressed:
- PopupMenuButtonのonSelected:
にNavigatorによる画面遷移を書く。
-
MaterialPageRouteのbuilderが返すWidgetにMyHomePageを流用。
-
参考
- AppBar | Flutter Doc JP
https://flutter.ctrnost.com/basic/navigation/appbar/
- AppBar | Flutter Doc JP
-
以下を参考に、ListTileのonTap:にNavigatorによる画面遷移を書く。
-
MaterialPageRouteのbuilderが返すWidgetにMyHomePageを流用。
-
参考
- Drawer | Flutter Doc JP
https://flutter.ctrnost.com/basic/navigation/drawer/ - Flutterでdrawerを利用した遷移時にdrawerを閉じる方法 - Qiita
https://qiita.com/hiko1129/items/9d31938046bbf4dcad2e
- Drawer | Flutter Doc JP
-
以下は、TabPageが遷移先で、Navigatorは使用しない。
-
_MyHomePageState.buildメソッドが
Scaffoldではなく、DefaultTabControllerを返すのもポイント。 -
参考
- TabBar | Flutter Doc JP
https://flutter.ctrnost.com/basic/navigation/tabbar/
- TabBar | Flutter Doc JP
-
以下は、PageWidgetが遷移先で、Navigatorは使用しない。
-
bottomNavigationBarのonTap:にIndex切替処理を書く。
-
参考
- BottomNavigationBar | Flutter Doc JP
https://flutter.ctrnost.com/basic/navigation/bottomnavigationbar/
- BottomNavigationBar | Flutter Doc JP
-
ナビゲーション | Flutter Doc JP
https://flutter.ctrnost.com/basic/navigation/ -
FlutterのNavigationとRoutingを理解する
https://itome.team/blog/2019/12/flutter-advent-calendar-day10/
- Flutter でよく使う(と思う)コードまとめ > 画面遷移
https://qiita.com/chooyan_eng/items/e7f1fcca1eeb0cf150b5 - [Flutter]画面遷移のやり方
https://qiita.com/kono-hiroki/items/b1a8f19dfab371e7816d
body, children or childと、レイアウトを行う。
-
どちらも原点は”左上”
-
デフォルトで
- Columnは縦方向いっぱい
- Rowは横方向いっぱい
のサイズになる。
body: Container(
...
child: Column or Row- 中央に寄るのはColmn(Row)自体。
- 内部コンテンツの位置は変わらない。
body: Center(
...
child: Column or Row- Align
- Padding
- FittedBox / BoxFit
- SafeArea
- 列内の行は縦にスタック
- 行内の内部コンテンツは横にスタック
body: Column(
...
children: <Widget>[
Row(- 行内の列は横にスタック
- 列内の内部コンテンツは縦にスタック
body: Row(
...
children: <Widget>[
Column(- Expanded
- Stack
- ListView / ListTile
- TabBar / Tab / TabBarView
- BottomNavigationBar
-
childプロパティのあるWidgetの、
margin、paddingプロパティにEdgeInsetsを指定する。margin: EdgeInsets.only(top: 100), padding: EdgeInsets.only(top: 50),
-
EdgeInsetsには以下のメソッドがある。
- only:上下左右のmargin/paddingを指定
- fromLTRB:onlyの名前無し引数版(上下左右)
- symmetric:縦方向横方向のmargin/paddingを指定
- all:全方向のmargin/paddingを指定
-
参考
- 【Flutter】Containerのmarginの設定方法
EdgeInsetsをざっくりまとめる | tty×Dev
https://ttydev.com/2020/11/11/flutter-edgeinsets/
- 【Flutter】Containerのmarginの設定方法
RowやColumnなど、childrenプロパティのあるWidgetは、
margin、paddingプロパティを持たないが、
Containerをネストして使用すると面倒なので、
SizedBoxを拡張したSpaceBoxを使用すると良い。
- 参考
- Padding(またはMargin)だけが目的でContainerを
使うのは間違ってる(というか分かりづらい) -Flutter-
- Padding(またはMargin)だけが目的でContainerを
内部コンテンツの位置
-
前述の、...の部分に、
mainAxisAlignment: MainAxisAlignment.XXXXX,
...と書き、主軸方向の配置位置を調整する。
- start/end
先頭/末尾寄せ - center
中央寄せ - spaceEvenly
間隔を均等に配置 - spaceAround
各余白を均等に配置 - spaceBetween
最大限に分散配置
- start/end
-
前述の、...の部分に、
crossAxisAlignment: CrossAxisAlignment.XXXXX,
...と書き、交差軸方向の配置位置を調整する。
- start/end
先頭/末尾寄せ - center
中央寄せ - stretch
引き伸ばして配置 - baseline
ベースラインを揃えて配置
- start/end
-
SizedBox.expand
交差軸方向のスペースをすべて取らない場合、
CrossAxisAlignmentが適切に機能しない事がある。
この場合は、SizedBox.expandで、スペースを消費させる。body: SizedBox.expand( child: Column( mainAxisAlignment: MainAxisAlignment.center, crossAxisAlignment: CrossAxisAlignment.center, children: <Widget>[ ..., ], ), ),
- Flutter基礎 – Column/Rowの色々な並べ方 | UKI-HOME
https://uki-home.xyz/2020/03/30/2052/
english_wordsパッケージを追加・利用する。
-
パッケージを探す。
-
サイトで、english_wordsを探す。
https://pub.dev/flutter/packages -
探したら、
https://pub.dev/packages/english_words- 評価を確認して、
https://pub.dev/packages/english_words/score - インストール方法を確認する。
https://pub.dev/packages/english_words/install
- 評価を確認して、
-
-
インストール方法は、
dependencies: flutter: sdk: flutter english_words: ^4.0.0
-
その後、ツール・メニューかコマンドから、Pub Getを実行。
-
インストールされ、pubspec.lockにも記載が追加される。
-
-
インポートした上で
import 'package:english_words/english_words.dart';
-
ライブラリを利用する(コチラのコードを修正)。
class _MyHomePageState extends State<MyHomePage> { String _counter = 'hoge'; void _incrementCounter() { setState(() { // This call to setState tells the Flutter framework that something has // changed in this State, which causes it to rerun the build method below // so that the display can reflect the updated values. If we changed // _counter without calling setState(), then the build method would not be // called again, and so nothing would appear to happen. _counter = WordPair.random().asPascalCase; }); }
shared_preferencesパッケージを追加する必要がある。
-
shared_preferences| Flutter Package
https://pub.dev/packages/shared_preferences/installdependencies: flutter: sdk: flutter shared_preferences: ^2.0.6
import 'package:shared_preferences/shared_preferences.dart';
Future<SharedPreferences> _prefs = SharedPreferences.getInstance();
late Future<int> _counter;
Future<void> _incrementCounter() async {
final SharedPreferences prefs = await _prefs;
final int counter = (prefs.getInt('counter') ?? 0) + 1;
setState(() {
_counter = prefs.setInt("counter", counter).then((bool success) {
return counter;
});
});
}
@override
void initState() {
super.initState();
_counter = _prefs.then((SharedPreferences prefs) {
return (prefs.getInt('counter') ?? 0);
});
}- Flutterでshared_preferencesを使う - Qiita
https://qiita.com/fukuit/items/0f385dde916cd7668c72
url_launcherパッケージを追加する必要がある。
-
url_launcher | Flutter Package
https://pub.dev/packages/url_launcher/installdependencies: flutter: sdk: flutter url_launcher: ^6.0.4
import 'package:url_launcher/url_launcher.dart';
_launchURL() async {
const url = "http://https://www.google.co.jp/";
if (await canLaunch(url)) {
await launch(url);
} else {
throw 'Could not Launch $url';
}
}- Flutterで外部ブラウザに遷移する - Qiita
https://qiita.com/superman9387/items/868ce6ad60b3c177bff1
HTTPパッケージを追加する必要がある。
-
http | Dart Package
https://pub.dev/packages/http/installimport 'package:http/http.dart';
-
Example
https://pub.dev/packages/http/exampleimport 'dart:convert' as convert; import 'package:http/http.dart' as http; // This example uses the Google Books API to search for books about http. // https://developers.google.com/books/docs/overview var url = Uri.https('www.googleapis.com', '/books/v1/volumes', {'q': '{http}'}); // Await the http get response, then decode the json-formatted response. var response = await http.get(url); if (response.statusCode == 200) { var jsonResponse = convert.jsonDecode(response.body) as Map<String, dynamic>; var itemCount = jsonResponse['totalItems']; print('Number of books about http: $itemCount.'); } else { print('Request failed with status: ${response.statusCode}.'); }
-
作法
-
Futureのメソッドチェーン
void sendRequest() { http .get(url) .then((response) { print(response); }) .catchError((error) => print(error)); }
-
async/await
Future<void> sendRequest() async { try { final response = await http.get(url); print(response); } on Exception catch (error) { print(error); } }
-
-
作法
-
Futureのメソッドチェーン
... -
async/await
var response = await http.post( "https://www.example.com/path/to/api", body: { "nickname": "chooyan", "description": "A freelance mobile app developer", }, );
-
-
コンテンツ
-
application/x-www-form-urlencoded
bodyに、Map<String, String>型 の変数を指定する。 -
application/json
- JSON形式のString型を指定する。
- json.encode(Map<String, String>型)でもOK。
-
-
ヘッダ
headersに、Map<String, String>型 の変数を指定する。 -
...
-
dart - Flutter http headers - Stack Overflow
https://stackoverflow.com/questions/53299447/flutter-http-headers -
Make authenticated requests - Flutter
https://flutter.dev/docs/cookbook/networking/authenticated-requests -
Google Books API からJSONデータを取得してjQueryで処理する - Qiita
https://dishware.sakura.ne.jp/swift/archives/129
-
Page 1 | Top Flutter packages
https://pub.dev/flutter/packages -
外部パッケージ | Flutter Doc JP
https://flutter.ctrnost.com/tutorial/tutorial04/ -
【Flutter】パッケージ導入手順 - Qiita
https://qiita.com/akeome/items/0a6ebf3af402fdf62c79
- FrontendTemplates/UI/XPlat at develop · OpenTouryoProject/FrontendTemplates
https://github.com/OpenTouryoProject/FrontendTemplates/tree/develop/UI/XPlat/
- Flutterの参考(Flutterの該当節を参照)
正誤
sendRequest()の async/await 版のon Exception caach (error)はcatchの誤記のため修正した。
移行メモ
- 元 Wiki では見出しそのものが他ページ・同ページ内へのリンクになっていた箇所 (「Android Studioのインストール」「Flutterの参考」「Flutterのセカンド・ステップ」)は、 GitHub Wiki では見出しからアンカが生成されるため、 見出しをプレーン・テキストとし、リンクは直下の本文に置いた。
- 同名の見出し(「チェック(2)」の元アンカが「チェック(1)」と同一 ID だった件を含め、「デバッグ実行」「参考」「Qiita」「パッケージの追加」 「パッケージの利用」「その他」)が多数あり GitHub Wiki でアンカが衝突するため、 括弧で文脈を補って一意にした。
Map<String, String>などの山括弧は、そのままでは HTML タグとして 解釈される箇所があるため、本文中では実体参照(</>)で記述した。- PukiWiki のページ内アンカ(
#xxxxxxxx)は GitHub Wiki では再現できないため、 同一ページ内のアンカは見出しから生成されるアンカに張り替え、 他ページのアンカを指すリンクは「〜(ページ名の該当節を参照)」の形に置き換えた。- マイクロソフト系技術情報 Wiki(techinfoofmicrosofttech.osscons.jp)への URL リンクは張り替え済み。
- 元 Wiki の行頭空白によるプレフォーマット・ブロックは、 フェンス付きコードブロックにした。
- 本文の無い見出しは、その旨を明示した。
- リンク先が未移行のページは、移行先のファイル名を
`DNET_○○.md`の形で示し TODO.md に登録した。
Tags: 移行, Flutter, Dart, Android Studio, flutter doctor, Widget, Navigator, レイアウト, パッケージ, DevTools
このWikiは「Open棟梁Project」,「OSSコンソーシアム 開発基盤部会」によって運営されています。