MOB-LOG

モブおじの記録 (Programming, 統計・機械学習)

Flutter

Firebaseで”hoge.key”などドット入りのフィールドは作ってはいけない。 DocumetReferenceのsetとupdateに与えるフィールド名の仕様が異なり困った話――docRef.set{’key.hoge’: hoge}) と docRef.update({’key.hoge’: hoge}) は意味が全く異なる。――

Firebase (Firestore)でデータを管理していて、`DocumentReference.update(data)` を使用してデータを更新するようなシステムを開発していたら、`update`は成功しているのにfirestore上で値が書き換わらないということが起った。どうやら与えるマップのフィ…

xcode - Flutter xcodebuild: error: Unable to find a destination matching the provided destination specifier (flutterでiOSアプリ開発していて、iOS simulatorの仮想デバイスとうまく接続できないとき)

問題→解決 iOSアプリ開発をしていて、iOS Simulatorをターゲットにしたらデバイスが一致しないぞ、と言われた。 xcodebuild: error: Unable to find a destination matching the provided destination specifier: { id:XXXX-XXXXX-XX-XXX} StackOverflowで完…

lateでnullableは初期値をnullとして扱ってくれないので明示的に代入しなければいけない (`late Object? = null;`)。そもそもnullでいいならlateにするな。

`late Object? hoge = null;` とするとnullableなのでnull代入要らないよ、と提案されるのにもかかわらず(**`avoid_init_to_null`**)、明示的な代入を覗いて`late Object? hoge;` にすると、いざ他に初期化してない場合には (`LateInitializationError: Fie…

やむを得ず List<子クラス>→List<親クラス>→List<子クラス>にキャストしたいとき(List<Child>→List<Parent>→List<Child>)。 ⇒ 要素ごとにキャストする。

TL;DR Flutter (Dart) でモバイルアプリを作っていたとき、Listの型キャストで以下の様に詰まった。 やりたいこと:List<子クラス>→List<親クラス>→List<子クラス>の型キャストをしたい。 問題:List<親クラス> → List<子クラス> の時点で汎化→特化ができな…

FlutterでDebug時は上手く動いたのにRelease/Profile では動かないってときには、どうデバッグすればよいか? →printデバッグすれば何とかなる

FlutterでDebug時には動いたのに、Releaseモードでは動いてくれない、という時にどうデバッグしたらよいか絶望して、どうにかした話。 ⇒ 解決策:Profileモードで実行して、printデバッグをすれば何とかなる。

Flutterでのオブジェクト同一性の確認 identityHashCode

Flutterでオブジェクトを比較するとき、`identityHashCode()`によるハッシュ値が使用できる。調べたい場面でブレークして、`identityHashCode(obj)`とするだけ。これで異なるスコープやsetState前後の同名の変数でもオブジェクトを比較できる。

Flutterでカメラ撮影後、CameraControllerを生成してCameraPreviewを立ち上げても何も映らない件→Future.delayed()で1[msec]だけ待ったら何とかなった

TL;DR FlutterでCameraController.takePicture()後にCameraPreviewを再起動するため、CameraControllerインスタンスを再生成・initialize()していたらAndroidでの実機デバッグ中にinitialize()が失敗してしまった。よくわからないが、インスタンスの生成→ini…

Flutterでウィジェットの再構築のために自身のクラスのインスタンスを生成して遷移していたが意味がなかった様子。StreamBuilderでFirebaseのドキュメントを表示していて、値が変更されても表示が更新されないとき。

(タイトルに書いてあるものの、今回はStreamBuilderもDocumentSnapshotも関係ありません) TL;DR Firebaseからのデータの再取得と画面の更新のためにウィジェットのインスタンスを再生成→新たなインスタンスへ遷移、としてリロードボタンを設置していたが、そ…

Flutterで遷移のときNavigatorに余計な遷移を残したくない場合、`pop()`→`push()`ではなく、`pushReplacement`を使う。 Navigator.of(context).pop() does not work in Flutter

TL; DR Flutterで遷移のときNavigatorに余計な遷移を残したくない場合、pop()→push()ではなく、pushReplacementを使う。 ⇒ Navigator.of(context).pushReplacement(MaterialPageRoute()) pop()→push()だとでコンテキストのスタックが現在のウィジェットしか…

Flutterで setState() or markNeedsBuild called during build →StatefulWidgetの@override build() が完了する前にMaterialPageRouteによる遷移を実行してしまったときのエラー

TL;DR StatefulWidgetの@override build() 内でMaterialPageRouteによる遷移やsetState()を実行してしまうと、setState() or markNeedsBuild called during build 例外が発生するので、そういった処理はbuildが完了した後に実行されるようにWidgetsBinding.i…

FlutterでWidget遷移したいがBuildContextが参照できないとき→ GlobalKey<State>をnavigatorKeyに指定してアプリのどこからでも参照できるようにする

TL;DR Flutterにて、Navigator.of(context)としてウィジェットを遷移するために、いつでもどこでも参照できる最新のBuildContextを保持した変数が欲しかった。 ⇒ MaterialAppのnavigatorKeyはどこからでも参照できる様子なので、main()でrunAppするとき、大…

FlutterでWidget遷移したいがBuildContextが参照できないとき→ GlobalKey<State>をnavigatorKeyに指定してアプリのどこからでも参照できるようにする

TL;DR Flutterにて、Navigator.of(context)としてウィジェットを遷移するために、いつでもどこでも参照できる最新のBuildContextを保持した変数が欲しかった。 ⇒ MaterialAppのnavigatorKeyはどこからでも参照できる様子なので、main()でrunAppするとき、大…

MapをMethodの引数にしようとしたときのnon_constant_default_value エラー: Map<String, dynamic> The default value of an optional parameter must be constant

関数、メソッドの引数に Map<String, dynamic> とか List <dynamic> とか与えたくなるけど、引数がOptionalの場合、適当に以下のように初期値を与えようとするとnon_constant_default_valueエラーになってしまう(”The default value of an optional parameter must be constant” とか</dynamic></string,>…