Life is Really Short, Have Your Life!!

ござ先輩の主に技術的なメモ

Flutter

FlutterのFirebase MessaingにおけるonTokenRefreshがよくわからない

このAPIすげー微妙な気がする。使い所がわからない。毎回 getToken でデバイストークンをぶん投げてええんちゃうって思う。 端末が変わる、アプリの再インストールでは自動的に新しいデバイストークンが採択されるから、onTokenRefreshが呼び出されることが…

Flutterだけやってるのが怖くなってきた話

2年半ぐらいFlutterをやっているし、今後もやっていくのですけれど、初学の頃に比べると刺激がなくなってきた。 「やらなければできない」ことが減っていることが怖い。 UIの実装ができれば、悩みどころは状態管理・Widgetの初期化と後処理・デザインシステ…

Google Playにリリースする時だけ、Firebase Authenticationが動かない

Firebase Authenticationに限らないと思いますが、半日ハマったので備忘録。こちらにすべてが書いてあった。 minpro.net 「Google Play」を経由してAndroidアプリとしてリリースする場合は、Android Studioで取得した「SHA-1」「SHA-256」ではなく、「Google…

StatefulWidgetを一切使わずRiverpodだけで頑張りたいお気持ち

2年近くFlutterをやっていて、データストアにRiverpodを使っている場合 StatefulWidgetはまじで要らない子なんじゃないかと思い始めている。disposeする対象の管理が面倒でメモリリークする可能性があり、良いことがない。コードも色々増える。 StatefulWidg…

Google 認証のしょーもないエラー

Unhandled Exception: PlatformException(network_error, com.google.android.gms.common.api.ApiException: 7: このエラーが出て、なんだろうと思ったら、なんてことはない、検証機AndroidのWifiが切れていて、インターネットにつながっていなかった... ち…

Asynchronous Gap on BuildContext

Flutter2.x系からこの問題がフィーチャーされるようになった気がする。1.xの時はそこまで。 どんな問題? 非同期でサーバーにデータを送った後、ダイアログを閉じるようなケース。 非同期でawaitを入れた所で、Flutterのウィジェットツリーの再構築が同期さ…

FlutterでUnixTimeをDateTimeに変換する

Firebaseのライブラリが国際化対応しているため、日時をUnixtimeで持っていた。 それをDartでDateTimeに変換するときのコードで、癖があったのでメモ。 www.kindacode.com final timestamp1 = 1627510285; // timestamp in seconds final DateTime date1 = D…

'Timestamp isn't a type' により、flutter buildが通らない

Firestoreのタイムスタンプ型をDartのDateTimeに変換する時に、1時間ほどハマってしまったので。 freezedを使っている人は多いと思いますが、DateTime⇔Timestampを変換するには、以下のようなコンバーターを噛ます必要があります。 class TimestampConverter…

FlutterのWidgetTest攻略メモ(随時更新)

WidgetTestを書いていて、Riverpodでビューの操作を行うクラスを全部DIして、ProviderのOverrideでMockに差し替えることをやっている。Mockにはmocktailを使っていて、このテスト戦略はシンプルでよい。サクサクテストが書ける。 riverpod.dev どうせ忘れる…

FlutterのWidgetテストをちゃんとできるような設計にするお勉強

FlutterのテストにはUnit / Widget / Integrationの3つの段階があるが、外部データソースのアクセスを利用しないでDartのオブジェクト上だけでテストを行うのが、UnitとWidgetのテスト。 とはいっても、昨今で外部リソースを一切使わないケースはない。 HTTP…

FutureProviderを持つ親画面を、子画面から更新する

Riverpodネタは続く。 カート一覧→タップで数量更新→画面が戻った時にカートが更新・・・されない!データは書き換わっているが、UIが更新されていなかった。 一覧画面のデータFutureProvider.autoDisposeを使って、画面下部のタブに表示している。iPhoneは…

RiverpodのProviderが管理するStateに引数を与えて初期化したい

画面遷移とかでよくあるよね。一覧から行タップで詳細に遷移する系のやつ。商品一覧→商品詳細みたいなやつです。 Riverpodが提供するProviderにはfamilyという関数があり、Providerを初期化する際に任意の型の引数を与えることができる。今回は、StateNotifi…

RiverpodでinitStateを使わず、autoDisposeでUIを再構築する

FlutterのRiverpodの話。 10月に入って、作りかけのアプリのProvider -> Riverpodへのリプレイスを行っています。zennで公開されているRiverpod解説には大変お世話になりました。 ひとつわからなかったのが、「タブを切り替えた時に自動でそのページの中身を…

Android StudioでUnable to find bundled Java version

flutter doctorでこの警告が出る場合。一定の手順に沿って行うだけ。JetBrain Toolboxを使っている人の対応策も書いてあった。 Macのユーザー名とAndroidStudioのバージョンは、その時の最新に差し替えれば良さそう。 stackoverflow.com cd /Users/<USER_NAME>/Library/</user_name>…

Flutterのテストは、ウィジェットレベルだけでよくね

Flutterには3段階のテストパターンが存在する。 Unit Test Widget Test Integration Test アプリケーションの性質にもよるだろうけど、ローカル or HTTPでデータをフェッチして表示するというロジックが多くを占める場合、Unit Testでテストすることがかなり…

Flutter(iOS)でアプリがアンインストールされたかを知る

キーチェーンに書き込んだ情報はアプリがアンインストールされても残ってしまうので、ユーザーがアプリを再インストールした時にそのtokenが残ってちょっとやだ、みたいなケース。 結論から言うと、NSUserDefaultsに書き込んで逃げるしか無いっぽい。アプリ…

Flutterで任意の画面までPopUntilしたい

商品検索 商品詳細 会員登録 or ログイン ログインページ こういうページ遷移の時、ログインページでログインが完了したら、2番の商品詳細に戻したい場合のTipsです。 2の商品詳細は、1の親画面でタップされたデータを元に画面を初期化するので、予めroutes:…

大量のライブラリの面倒を見てくれるFlutterのありがたみ

Flutterを簡単に言えば、Dartでアプリを作るとiOS/Androidのネイティブアプリのプロジェクトに翻訳して、ネイティブアプリをワンソースで出来る仕組みです。 その中で、Flutterが提供してくれる多くのウィジェットや通信・DBのライブラリなどがあったりする…

RiverPodをやってみた

Flutterの設計で一番悩ましいのが、ViewとModelの連携。状態遷移だと思われる。 2020年の初頭からFlutterやりはじめて、「Provider + ChangeNotifier」でやってた。これでも全然動く。 ただ、Providerは必ずcontextを経由する必要があるので、ウィジェットの…

FlutterでTextFieldに非同期で取得した結果を初期値に入れたい

色々探してやっとわかった.. flutter.institute initStateに直接awaitって書くことは出来ない。そりゃそうだな。ビルドが終わってから状態を変え、再ビルドするという方法を探していた。 class MyWidget extends StatefulWidget { @override State createSta…

Flutterでカメラで画像を撮って保存したい

まー、ありますわね。そーゆーのがね。 要件としては、写真撮ってメモを追加して何件かリストにしてPOSTだから、取った写真をリスト表示できることが必要。これが意外と難しくてワロタ。 最終的に、こういう風にするしかなさげ。 image_pickerプラグインで画…

Flutterのjson_serializableで無限ループになったら

おきまりの flutter pub run build_runner build を叩くと、エンドレスにビルドが走って終わらなくなった・・・。@JsonSerializable アノテーション以外のファイルまで見に行ってる。widget_test.dart を見に行くアホがおるかい。 英語でググってみたところ…

Flutter楽しいれす

前職の兼ね合いで、一緒になって作りたいサービスを5月から合間見て作っております。それにはスマホのネイティブアプリが必要だったので、Flutterで作り始めているのですが、これはすごいっすね。ありがとうFlutterを作ってくれたネ申エンジニア。儲かったら…

レッツゴーFlutter

展示会運営のアプリをAndroid・iOSで各々ネイティブで作って運営しているが、やっぱりワンソースでいい感じにやりたい...2つ同じもの作るのは単純に辛い。メンテナンス・コストが単純に倍になるのがだるい。1から勉強したってのもあるけど、フルコミットでリ…