Open49

【Flutter】メモ(雑記)

yamadayamada

メモに誤りがあった場合や、よくわからない点があったらコメントしていただけると嬉しいです!

yamadayamada

Firebase-messaging受信直後アプリがクラッシュ
以下パッケージをダウングレードすると解消

// firebase_messaging: ^14.6.5から
firebase_messaging: ^14.6.2
Hidden comment
Hidden comment
yamadayamada

・プッシュ通知のオンオフの方法
FCMのnotificationを削除し、dataのみ送信

  const payload = {
    data:{

    },
    // notification: {
    // },
  };
yamadayamada

・翻訳ミス?
https://firebase.google.com/docs/reference/fcm/rest/v1/projects.messages#Notification

こちらではtopicプロパティの説明欄に

"/topics/" prefix should not be provided.

訳:/topics/プレフィックスは指定しないでください

とあるが、

https://firebase.google.com/docs/cloud-messaging/ios/topic-messaging?hl=ja#java_2

こちらでは、

// The topic name can be optionally prefixed with "/topics/".

訳:// オプションでトピック名の前に「/topics/」を付けることができます。

とある。
/topics/プレフィックスをつけるとうまくいったという人がいるが、私はつけないでうまくいった。

Hidden comment
yamadayamada

この1行を追加すると、クライアントとfirestoreとのやりとりのログがデバッグコンソールに表示される。

await FirebaseFirestore.setLoggingEnabled(true);
yamadayamada

【showBottomSheetのbottomSheetが表示されるスピード(duration/reverseDuration)を調整したい】

以下の二つがある。

1.transitionAnimationControllerプロパティに調整したAnimationControllerを設定する
https://stackoverflow.com/questions/66655426/flutter-dart-how-to-adjust-modalbottomsheet-animation-speed

  1. アプリ全体で固定する。
    material/bottom_sheet.dartを直接変更する。
// この部分
const Duration _bottomSheetEnterDuration = Duration(milliseconds: 200);
const Duration _bottomSheetExitDuration = Duration(milliseconds: 200);
yamadayamada

・パッケージの依存関係を確かめる

flutter pub outdated
yamadayamada
'package:go_router/src/parser.dart': Failed assertion: line 64 pos 12: 'routeInformation.state != null': is not true.

MaterialAppに1行追加したら解決

          return MaterialApp.router(
            /* 省略 */
            routeInformationProvider: router.routeInformationProvider,  // これを追加
          );
yamadayamada
HiveError: Cannot read, unknown typeId: 32. Did you forget to register an adapter?

アプリをデバイスから削除し、もう一度ビルドすると治る。

yamadayamada

Aligment

https://stackoverflow.com/questions/53716571/how-to-align-single-widgets-in-flutter


真ん中下のAligmentは間違っています。Alignment(0.0, 0.0)ではなく、Alignment(0.0, 1.0)です

Alignment.topLeft is Alignment(-1.0, -1.0)
Alignment.topCenter is Alignment(0.0, -1.0)
Alignment.topRight is Alignment(1.0, -1.0)
Alignment.centerLeft is Alignment(-1.0, 0.0)
Alignment.center is Alignment(0.0, 0.0)
Alignment.centerRight is Alignment(1.0, 0.0)
Alignment.bottomLeft is Alignment(-1.0, 1.0)
Alignment.bottomCenter is Alignment(0.0, 1.0)
Alignment.bottomRight is Alignment(1.0, 1.0)

yamadayamada

プッシュ通知を種別ごとにON、OFFするにはFCMflutter_local_notificationSharedPreferencesを使う

yamadayamada

Vscodeで複数のファイルを選択し移動させると自動でimportパスを変更してくれる機能が実行されない

yamadayamada

TextウィジェットのfontSizeがある一定以上の場合、StrutStyleheightがうまく機能しない。
(文字のpaddingかmarginの関係?)

yamadayamada

share_plusパッケージをインストールし、ビルドすると以下のエラーが出る。

Execution failed for task ':app:checkDebugDuplicateClasses'.
> A failure occurred while executing com.android.build.gradle.internal.tasks.CheckDuplicatesRunnable
   > Duplicate class kotlin.collections.jdk8.CollectionsJDK8Kt found in modules jetified-kotlin-stdlib-1.8.10 (org.jetbrains.kotlin:kotlin-stdlib:1.8.10) and jetified-kotlin-stdlib-jdk8-1.7.10 (org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.7.10)

解決方法としてはshare_plusパッケージの以下の行をコメントアウトする。

├── share_plus-7.10.0 
  └── android
     └── build.gradle
        implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"
        //  implementation 'androidx.core:core-ktx:1.10.1'    <- この行をコメントアウト
        implementation 'androidx.annotation:annotation:1.5.0'
yamadayamada

flutter upgrade実行後、エラーが発生。

ProcessException: Process exited abnormally:
remote: Repository not found.
fatal: repository 'https://github.com/my_user_name/flutter.git/' not found
  Command: git fetch --tags

以下コマンドをflutterがインストールされているパスにて実行し、解決。

git remote set-url origin https://github.com/flutter/flutter.git

ちなみにパスは(MacOSでは)
/Users/userName/development/flutter

yamadayamada

geolocatorパッケージのgetLastKnownPositionメソッドのTimeStampはデバイスの時間ではなく、UTC時間

yamadayamada

Cloud SchedulerCloud FunctionsFCMを送信すれば、それをトリガーとしてIOSでもバックグラウンドで定期的に処理を実行できる。

Hidden comment
yamadayamada

firebaseMessagingの公式リポジトリに誤り(?)

    FirebaseMessaging.onBackgroundMessage((RemoteMessage event) async {
      print("Received new message: ${event.data}");
    });

これだと匿名関数のため下記例外がスロー

Exception has occurred.
_TypeError (Null check operator used on a null value)

https://github.com/firebase/snippets-flutter/blob/4c0981927430bde613f9865ab1a3f050ca845458/packages/firebase_snippets_app/lib/snippets/cloud_messaging.dart#L66

正解(公式ドキュメント)

https://firebase.flutter.dev/docs/messaging/usage/#background-messages

yamadayamada

VScodeが重くなる

突然、VScodeが重くなり、IDEとしての機能が使えなくなってしまった。

理由

freezedのコードに誤りがあった。


class SampleState with _$SampleState {
  const factory SampleState({
    required String? omoidesu,
  }) = SampleState;   // <- ここ
  const SampleState._();
}

}) = SampleState;の部分にアンダーバーを記入していませんでした。

修正後


class SampleState with _$SampleState {
  const factory SampleState({
    required String? omoidesu,
  }) = _SampleState; 
  const SampleState._();
}
yamadayamada

FCMをバックグラウンドで受信できない件

・ブレークポイントをつけていると実行できない部分がある(現在位置情報取得など)(原因究明中)

yamadayamada

FirebaseAuthException.code channel-error

signInWithEmailAndPassword実行時の引数(メールアドレス、パスワード)に値を設定していなかったときに発生

Hidden comment
Hidden comment
yamadayamada

FirebaseAuth: パスワードリセットメールを送信し、ユーザーがリセットを実行すると、emailVerifiedが自動的にtrueに設定される

ユーザーがメール確認処理を未実行の状態(emailVerified: false)で、パスワード再設定用処理を実行(メールを発行し新パスワードを設定)すると、自動的にメール確認が実行される(emailVerified: true

https://stackoverflow.com/questions/70568146/firebase-resetting-password-without-verifying-the-account

yamadayamada

Info.plistへの記述誤りについて

生体認証を実装しようとInfo.plistに以下文言を追記.

<key>NSFaceIDUsageDescription</key>

この状態で実行すると以下のエラーがスロー.

unable to read property list from file: /Users/MyFlutterApply/ios/Runner/Info.plist: The operation couldn’t be completed. (XCBUtil.PropertyListConversionError error 2.)

解決方法

Info.plistに以下文言を追記

<key>NSFaceIDUsageDescription</key>
    <string>生体認証を使用</string>  /* 追記 */
yamadayamada

Hive error

ローカルストレージパッケージHive使用中以下のようなエラーがスロー.

flutter hive type 'double' is not a subtype of type 'String' in type cast

アプリを調査したが、問題となるコードなどは見当たらない.

原因

どうやらHiveで作成されたDBが破損しているらしい.
https://github.com/isar/hive/issues/1027

解決方法

デバイス(もしくはシミュレーター)からアプリを削除し、再ビルド

yamadayamada

問題:Indicatorのサイズが最大となってしまう

解決:CenterWidgetでラップする

yamadayamada

コード

  await Firebase.initializeApp();

エラー

PlatformException (PlatformException(null-error, Host platform returned null value for non-null return value., null, null))

解決方法

以下コマンド実行後、作成されるファイルをoptions引数に指定する。

> flutterfire configure
  await Firebase.initializeApp(
    options: DefaultFirebaseOptions.currentPlatform,
  );
yamadayamada

アプリアイコンサイズ

Android: 512✖️512の中に312✖️312のアイコンを配置

yamadayamada

StateError (Bad state: Future already completed)

part 'news_controller.g.dart';


class NewsController extends _$NewsController {
  
  FutureOr<News> build() => const News(news: null);

  Future<void> fetchNews() async {
    state = const AsyncLoading();
    state = await AsyncValue.guard(dataSource.fetchNews);
  }
}

buildメソッドの書き方が誤っていた。

修正前
  
  FutureOr<News> build() => const News(news: null);
修正後
  
  FutureOr<News> build() async => const News(news: null);
Hidden comment
yamadayamada

enumのfactoryメソッドはVScodeのSnippetsには表示されない

yamadayamada

FCMをトークンではなくトピックで送信する際は、リリースモードでデバッグしないと、トピックを購読するコードで処理が止まる