【Flutter】メモ(雑記)
メモに誤りがあった場合や、よくわからない点があったらコメントしていただけると嬉しいです!
Firebase-messaging受信直後アプリがクラッシュ
以下パッケージをダウングレードすると解消
// firebase_messaging: ^14.6.5から
firebase_messaging: ^14.6.2
・プッシュ通知のオンオフの方法
FCMのnotificationを削除し、dataのみ送信
const payload = {
data:{
},
// notification: {
// },
};
いいねボタン
・翻訳ミス?
こちらではtopicプロパティの説明欄に
"/topics/" prefix should not be provided.
訳:/topics/プレフィックスは指定しないでください
とあるが、
こちらでは、
// The topic name can be optionally prefixed with "/topics/".
訳:// オプションでトピック名の前に「/topics/」を付けることができます。
とある。
/topics/
プレフィックスをつけるとうまくいったという人がいるが、私はつけないでうまくいった。
Flexible(), Expanded(), Positioned(), TableCell() ウィジェットは、親ウィジェットが決まっている。
この1行を追加すると、クライアントとfirestoreとのやりとりのログがデバッグコンソールに表示される。
await FirebaseFirestore.setLoggingEnabled(true);
【showBottomSheetのbottomSheetが表示されるスピード(duration/reverseDuration)を調整したい】
以下の二つがある。
1.transitionAnimationControllerプロパティに調整したAnimationControllerを設定する
- アプリ全体で固定する。
material/bottom_sheet.dartを直接変更する。
// この部分
const Duration _bottomSheetEnterDuration = Duration(milliseconds: 200);
const Duration _bottomSheetExitDuration = Duration(milliseconds: 200);
・パッケージの依存関係を確かめる
flutter pub outdated
AlertDialog周辺に存在する透明なpaddingを削除する。
contentPadding: EdgeInsets.zero,
※この場合、contentPadding
だが、実質margin
のような気もする(?)
'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, // これを追加
);
HiveError: Cannot read, unknown typeId: 32. Did you forget to register an adapter?
アプリをデバイスから削除し、もう一度ビルドすると治る。
Aligment
真ん中下の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)
プッシュ通知を種別ごとにON、OFFするにはFCM
とflutter_local_notification
とSharedPreferences
を使う
Vscodeで複数のファイルを選択し移動させると自動でimportパスを変更してくれる機能が実行されない
Google CloudのSecret Managerにシークレットを登録する際はコンソール画面で追加するのではなく、コマンドで追加した方が権限周りの設定が楽
TextウィジェットのfontSize
がある一定以上の場合、StrutStyle
のheight
がうまく機能しない。
(文字のpaddingかmarginの関係?)
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'
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
geolocator
パッケージのgetLastKnownPosition
メソッドのTimeStampはデバイスの時間ではなく、UTC時間
Cloud Scheduler
とCloud Functions
でFCM
を送信すれば、それをトリガーとしてIOSでもバックグラウンドで定期的に処理を実行できる。
barrel file
を自動生成してくれる拡張機能
ただし、ディレクトリ名と同じ名前のファイルがあった場合には上書きされてしまうので注意が必要(Ctrl + z では戻せない)
firebaseMessagingの公式リポジトリに誤り(?)
FirebaseMessaging.onBackgroundMessage((RemoteMessage event) async {
print("Received new message: ${event.data}");
});
これだと匿名関数のため下記例外がスロー
Exception has occurred.
_TypeError (Null check operator used on a null value)
正解(公式ドキュメント)
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._();
}
FCMをバックグラウンドで受信できない件
・ブレークポイントをつけていると実行できない部分がある(現在位置情報取得など)(原因究明中)
[Flutter] テスト実行時にMissingPluginExceptionが発生する
Hiveの使用方法についての参考サイト
Implicit interfaces について
著名なFlutter GDE
channel-error
FirebaseAuthException.code signInWithEmailAndPassword実行時の引数(メールアドレス、パスワード)に値を設定していなかったときに発生
emailVerified
が自動的にtrue
に設定される
FirebaseAuth: パスワードリセットメールを送信し、ユーザーがリセットを実行すると、ユーザーがメール確認処理を未実行の状態(emailVerified: false
)で、パスワード再設定用処理を実行(メールを発行し新パスワードを設定)すると、自動的にメール確認が実行される(emailVerified: true
)
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> /* 追記 */
Hive error
ローカルストレージパッケージHive
使用中以下のようなエラーがスロー.
flutter hive type 'double' is not a subtype of type 'String' in type cast
アプリを調査したが、問題となるコードなどは見当たらない.
原因
どうやらHiveで作成されたDBが破損しているらしい.
解決方法
デバイス(もしくはシミュレーター)からアプリを削除し、再ビルド
i18nとは
多言語対応する際に出てくるキーワードi18n
は"Internationalization"(国際化)の略語らしい
問題:Indicatorのサイズが最大となってしまう
解決:CenterWidgetでラップする
firebase_options.dart作成
> flutterfire configure
コード
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,
);
アプリアイコンサイズ
Android: 512✖️512の中に312✖️312のアイコンを配置
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);
enumのfactoryメソッドはVScodeのSnippetsには表示されない
FCMをトークンではなくトピックで送信する際は、リリースモードでデバッグしないと、トピックを購読するコードで処理が止まる