Closed6

Flutter における Firebase Crashlytics の学習

高田 晴彦高田 晴彦

目的

  • 公式ドキュメントに基づいた、Firebase Crashlytics の設定を個人のサンプルアプリに設定する
  • その挙動は Android エンジニアとして長年の経験から見て、納得のいくものかを確認する。
高田 晴彦高田 晴彦

Flutter アプリに Firebase を追加する

  • Firebase CLI だけでなく、FlutterFire CLI も必要
  • マルチパッケージの場合 flutterfire configure はアプリケーションのパッケージに対して行う。

動作確認のため Analytics を追加する

アプリにアナリティクス SDK を追加する

画面遷移イベント送信

FirebaseAnalytics.instance.logScreenView(
    screenName: "home",
);

イベントをデバッグする

プルリク

https://github.com/tfandkusu/ga913_flutter/pull/32

高田 晴彦高田 晴彦

強制的にクラッシュさせる

参考 強制的にテスト クラッシュを発生させて設定を完了する
Android と違い、わざと例外を投げただけではクラッシュ - アプリが画面から消えたりしない。先の処理が実行されないだけ。

SwitchListTile(
  title: Text(l.homeFavoritesOnly),
  value: uiModel.favoritesOnly,
  onChanged: (value) {
    throw Exception();
    eventHandler.onFavoritesOnlyChanged(value);
  },
),

Widget を作るところでクラッシュさせても同様

()
class DetailScreen extends HookConsumerWidget {
  final int _landmarkId;
  const DetailScreen(this._landmarkId, {super.key});

  
  Widget build(BuildContext context, WidgetRef ref) {
    throw Exception();
    return Scaffold( /* 略 */);
  }
高田 晴彦高田 晴彦

Firebase Crashlytics を使ってみる

公式ドキュメント通りの設定でクラッシュレポートを送信できた。

Flutter フレームワークで処理されない非同期エラーをキャッチするには、PlatformDispatcher.instance.onError を使用します。

こちらは別スレッドで例外を発生させると使用することができる。

Future.delayed(Duration(seconds: 1), () {
  throw Exception('Async error example');
});

プルリク

https://github.com/tfandkusu/ga913_flutter/pull/33

高田 晴彦高田 晴彦

非重大なエラーの送り方

FirebaseCrashlytics.instance.recordFlutterError(
    FlutterErrorDetails(
        exception:
            Exception("Firebase Crashlytics Non Fatal")));

高田 晴彦高田 晴彦

公式ドキュメントに載っている実装そのまま使うべきか

実装内容の要約

すべてのスレッドにおいて、キャッチしていない例外が発生しても、アプリは引き続き使えるが、クラッシュとして記録される。

結論

そのまま使うで良い。クラッシュの先には進めないため、ユーザのやりたいことが実現できていない可能性が高い。例えばメッセージ送信ボタンを押したあとの処理でキャッチしていない例外が発生したとしたら、相手にメッセージを送れていない。このことを非重大と呼んではいけないと思う。

このスクラップは2025/01/26にクローズされました