Flutterおぼえがき


Fultterをいじったりドキュメントを読んだ自分用覚書。ネタがあれば追記していきます。
https://flutter.io/

# Package management
Dartのpackage managementはPubで行う。8/12時点ではfultter.ioにfultter対応しているかの検索はできないと書いてあったがwebではできるようになってた
https://pub.dartlang.org/flutter/packages/


# Platform固有処理の呼び出し
Platform channelを使ってiOS, Android特有コードを呼び出せる。AppDelegateとActivityにメソッドごとの処理を登録していくスタイル。Dartで固有処理を書くことはできず、iOS, AndroidそれぞれでJava, Swiftなどのコードを書かないといけない。
`MessageCodec`クラスを使ってお互いの送受信データの型を決める。っぽい。
https://flutter.io/platform-channels/


# HTTP通信
https://flutter.io/networking/
`http`パッケージを使ってclientインスタンス作ってpost()とかget()とか呼ぶ。

# データ保存
## File IO
`PathProvider`というプラグインを使うことでiOS, Androidでほぼ同じような目的に利用できるpathを取得できる。pathが決まれば`dart:io`で読み書きする。
JSON形式で保管したければ`dart:convert`の`JSON.decode`、`JSON.encode`を使えば良さそう。
https://flutter.io/reading-writing-files/

## Database
### Firebase database
https://pub.dartlang.org/packages/firebase_database
### SQLite pulugin for flutter
https://pub.dartlang.org/packages/sqflite
Current issuesのところは要注意。

# Logging
https://flutter.io/debugging/#print-and-debugprint-with-flutter-logs
簡単なデバッグであれば`print()`で十分でIntelliJのコンソールビューで確認できる。(Observatoryのloggingでは表示できなかったのはなんでだろう？)。flutter.io曰く、長すぎるログはたまに切られてしまうので`faundation`（~~`services `ライブラリ~~から変更された模様）の`debugPrint()`使ったら良いよとのこと。

#### Memo
`debugPrint(jsonInstance)`を実行してみたらExceptionが出てしまった。どうやら第一引数をString前提にしているようで、`debugPrint(jsonInstance.toString())`としたら想定通りに動いた。

dart言語自体のloggingはこちらにまとまっていた。 http://qiita.com/zukkun/items/faa505032847abf30f45
`dart:html`の`console.print()`はflutterでは使わないで良いだろう。また、上記リンクにもある`logging`パッケージを使えばLog4Jのようなレベルごとのloggingが可能になる。"環境ごとの設定"に書いたようなやり方でビルドごとに適切なログレベルを設定すればよさそう。


# Web View
## flutter webview plugin
https://pub.dartlang.org/packages/flutter_webview_plugin
flutterアプリの中でではなく、iOS, Androidそれぞれで新しいActivity, ViewControllerを生成してwebviewを埋め込むらしい。最近だとワンタッチで元のアプリに戻れるようになってきているのでOSにURL投げてブラウザアプリを立ち上げてもらった方法でできるだけ作ればここで困ることはなさそう。

# Icon font
色々あると楽なので。
## Font awesome
https://pub.dartlang.org/packages/font_awesome_flutter
## Open Iconic
https://pub.dartlang.org/packages/open_iconic_flutter

# Test
https://flutter.io/testing/
## Unit test
`test`ディレクトリ以下にテストコードを作る。Rspec風。dartにも`mockito`がある！嬉しい！
https://github.com/dart-lang/mockito
## widget test
Wedget単体でテストするための仕組み。再利用するwedgetを作ったらこれでテスト。
## Integration test
実機またはシュミレータを使ったUIテスト。SeleniumやEspresso, UI Automaterと同等らしい。ということはパーツをidなどでfindできるのかな？要チェック。

# 環境ごとの設定
https://flutter.io/assets-and-images/#loading-text-assets
text assetをロードしてjsonなど好きな形式のテキストから読み込む。環境の判定は[ここ](https://github.com/flutter/flutter/blob/561d17a87606f8cf118b57bfacccb1acf6b9b594/packages/flutter/test/foundation/profile_test.dart#L9)の方法でreleaseか否かの判定ができる。
`assets`ディレクトリはproject rootに作る。`pubspec.yaml`に

```
  # To add assets from package dependencies, first ensure the asset
  # is in the lib/ directory of the dependency. Then,
  # refer to the asset with a path prefixed with
  # `packages/PACKAGE_NAME/`. The `lib/` is implied, do not
  # include `lib/` in the asset path.
```
と書いてあるが、libに入れる必要はない。`pubspec.yaml`に

```
flutter:
  assets:
    - assets/config.json # yourproject/assets/config.jsonで配置
```
と宣言して、dart側で

```
rootBundle.loadString('assets/config.json');
```
を呼び出してあとはFutureをごにょればよい。`rootBundle`と`DefaultAssetBundle`の使い分けはflutter.io参照。

# Debug tool
## Dart Observatory
Dart VMで使えるブラウザベースのデバッグツール。
Intelli Jで起動してRun view(ログが出てるビュー）の上にあるOpen Observatoryアイコン（時計？）から起動する。`flutter run`でコマンドラインからアプリを起動した場合は起動メッセージの最後にでるアドレスから利用できる。break pointを貼る、ステップ実行する、パフォーマンス計測などに使える。また、ブラウザベースなのでIPアドレス部分を適切に変換すれば同じObservatory画面を別のエンジニアにシェアできるので協力しデバッグができる、とのこと。詳しくはhttps://dart-lang.github.io/observatory/

# その他
## slow mode
サンプルアプリを起動するとslow modeというリボンが右上に表示される。これはObservatoryなどのdebugを可能にするための開発モードのビルドをしているため。確かにこのモードのサンプルは遅い。`--release`や`--profile`をつけるとリボンがPreviewになって動きの重さが解消される。