閱讀時間約 1 分鐘

408 字

將 Firebase 與 Google Analytics 設定好以後,Flutter 可以很方便地送出 screen_view 事件。但必須在每一頁手動加入,找到了一個方法可以在改動最小的情況下每一頁自動送出。

使用 Mixin

解法是實作一個 Mixin,並在每一頁使用。

import 'package:firebase_analytics/firebase_analytics.dart';
import 'package:flutter/widgets.dart';
import 'package:intl/intl.dart';

// 在這邊定義每一個頁面。
enum AnalyticsRoute {
  example,
}

mixin RouteAwareAnalytics<T extends StatefulWidget> on State<T>
    implements RouteAware {
  AnalyticsRoute get route;

  @override
  void didChangeDependencies() {
    routeObserver.subscribe(this, ModalRoute.of(context) as PageRoute);
    super.didChangeDependencies();
  }

  @override
  void dispose() {
    routeObserver.unsubscribe(this);
    super.dispose();
  }

  @override
  void didPop() {}

  @override
  void didPopNext() {
    // 上一頁被 pop 掉以後顯示這一頁。
    _setCurrentScreen(route);
  }

  @override
  void didPush() {
    // 這一頁被顯示的時候。
    _setCurrentScreen(route);
  }

  @override
  void didPushNext() {}

  Future<void> _setCurrentScreen(AnalyticsRoute analyticsRoute) async {
    // 將首字母轉為大寫。
    String screenName =
        toBeginningOfSentenceCase(analyticsRoute.name.toString()) ?? '';
    await FirebaseAnalytics.instance.logEvent(
      name: 'screen_view',
      parameters: {
        'firebase_screen': screenName,
        // 假設 Class 名稱為 screenName + "Screen",請改成你自己的 Class 名稱。
        'firebase_screen_class': '${screenName}Screen',
      },
    );
  }
}

在每一個頁面使用 RouteAwareAnalytics

class ExampleScreen extends StatefulWidget {
  @override
  _ExampleScreenState createState() => _ExampleScreenState();
}

class _ExampleScreenState extends State<ExampleScreen> with RouteAwareAnalytics {
  @override
  AnalyticsRoute get route => AnalyticsRoute.example;
  // 其他程式碼...
}

記得在初始化 App 時註冊 routeObserver

return MaterialApp(
  navigatorObservers: [
    routeObserver,
  ],
  // 其他程式碼...
)

隔天在 Google Analytics 頁面上就看得到了,如果想要即時除錯的話可以使用 DebugView

參考資料

  1. Stackoverflow answer
comments powered by Disqus

最新文章

分類

標籤