Flutter Firebase集成插件simplytics_firebase的使用

Flutter Firebase集成插件simplytics_firebase的使用

Simplytics 是一个用于分析和崩溃报告的简单抽象层。此包为 Simplytics 添加了对 Firebase AnalyticsCrashlytics 服务的支持。

使用

要开始在 Flutter 中使用 Simplytics 和 Firebase,你需要初始化 Firebase 并配置 Simplytics,指定要使用的分析和服务错误监控类:

await Firebase.initializeApp();

Simplytics.setup(
  analyticsService: SimplyticsFirebaseAnalyticsService(FirebaseAnalytics.instance),
  crashlogService: SimplyticsFirebaseCrashlogService(FirebaseCrashlytics.instance),
);

Firebase调试

Firebase Analytics

要在 Firebase Analytics 的 DebugView 中查看分析事件,请运行以下命令:

adb shell setprop debug.firebase.analytics.app <PACKAGE_NAME>

请参阅 Firebase Analytics 文档 了解更多详细信息。

Firebase Crashlytics

要在 Firebase Crashlytics 中查看错误报告,请运行以下命令:

adb shell setprop log.tag.FirebaseCrashlytics DEBUG

要禁用这些报告发送到系统日志,请运行以下命令:

adb shell setprop log.tag.FirebaseCrashlytics INFO

完整示例代码

以下是一个完整的示例代码,展示了如何在 Flutter 应用程序中使用 simplytics_firebase 插件:

import 'package:firebase_analytics/firebase_analytics.dart';
import 'package:flutter/material.dart';
import 'package:simplytics/simplytics.dart';
import 'package:firebase_core/firebase_core.dart';
import 'package:firebase_crashlytics/firebase_crashlytics.dart';
import 'package:simplytics_firebase/simplytics_firebase.dart';
import 'package:simplytics_firebase_example/page_route_settings.dart';

void main() {
  runAppGuarded(
    // 初始化 Firebase 和 Simplytics
    () async {
      // 初始化 Firebase
      await Firebase.initializeApp();

      // 设置 Simplytics
      Simplytics.setup(
        analyticsService: SimplyticsFirebaseAnalyticsService(FirebaseAnalytics.instance),
        crashlogService: SimplyticsFirebaseCrashlogService(FirebaseCrashlytics.instance),
      );

      // 设置自定义用户属性
      Simplytics.analytics.setUserProperty(
        name: 'app_id',
        value: 'simplytics_firebase_example',
      );

      return const MyApp();
    },

    // 发送致命错误到 Simplytics
    onError: (error, stackTrace) => Simplytics.crashlog.recordFatalError,
  );
}

class MyApp extends StatelessWidget {
  // 设置观察者
  static SimplyticsNavigatorObserver observer = SimplyticsNavigatorObserver(
    nameExtractor: (route) => (route.settings is PageRouteSettings)
        ? (route.settings as PageRouteSettings).pageName
        : route.settings.name,
    routeFilter: (route) => (route is PageRoute) || (route is RawDialogRoute),
  );

  const MyApp({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Simplytics Firebase Demo',
      theme: ThemeData(
        primarySwatch: Colors.orange,
      ),
      home: const DemoPage(),

      // 添加观察者到 navigatorObservers
      navigatorObservers: <NavigatorObserver>[observer],
    );
  }
}

// 主演示页面

class DemoPage extends StatelessWidget {
  const DemoPage({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      body: Center(
        child: Column(
          crossAxisAlignment: CrossAxisAlignment.center,
          mainAxisSize: MainAxisSize.min,
          children: [
            OutlinedButton(
              onPressed: () {
                Navigator.push(
                  context,
                  MaterialPageRoute(
                    // 设置 `settings` 以在发送到分析时设置页面名称。
                    settings: const PageRouteSettings(pageName: 'Analytics Demo Page'),
                    builder: (context) => const AnalyticsDemoPage(),
                  ),
                );
              },
              child: const Text('Analytics tests'),
            ),
            OutlinedButton(
              onPressed: () {
                Navigator.push(
                  context,
                  MaterialPageRoute(
                    // 设置 `settings` 以在发送到分析时设置页面名称。
                    settings: const PageRouteSettings(pageName: 'Error Reporting Demo Page'),
                    builder: (context) => const ErrorDemoPage(),
                  ),
                );
              },
              child: const Text('Error Reporting tests'),
            ),
            const Divider(),
            OutlinedButton(
              onPressed: () {
                showDialog(
                    context: context,
                    builder: (context) => const TestDialog());
              },
              child: const Text('Dialog test'),
            ),
            OutlinedButton(
              onPressed: () {
                showDialog(
                  context: context,
                  // 设置 `settings` 以在发送到分析时设置页面名称。
                  routeSettings: const PageRouteSettings(pageName: 'Dialog with a named route'),
                  builder: (context) => const TestDialog(),
                );
              },
              child: const Text('Dialog test with a named route'),
            ),
          ],
        ),
      ),
    );
  }
}

// 分析示例

class PostScoreEvent extends SimplyticsEvent {
  final int score;
  final int level;
  final String? character;

  PostScoreEvent({required this.score, this.level = 1, this.character});

  [@override](/user/override)
  SimplyticsEventData getEventData(SimplyticsAnalyticsInterface service) {
    if (service is SimplyticsFirebaseAnalyticsService) {
      return SimplyticsEventData(
        name: 'post_score',
        parameters: {
          'score': score,
          'level': level,
          'character': character,
        },
      );
    } else {
      return SimplyticsEventData(
        name: 'game_score',
        parameters: {
          'scoreValue': score,
          'gameLevel': level,
          'characterName': character,
        },
      );
    }
  }
}

class AnalyticsDemoPage extends StatefulWidget {
  const AnalyticsDemoPage({super.key});

  [@override](/user/override)
  State<AnalyticsDemoPage> createState() => _AnalyticsDemoPageState();
}

class _AnalyticsDemoPageState extends State<AnalyticsDemoPage> {
  [@override](/user/override)
  void initState() {
    super.initState();

    Simplytics.analytics.setUserId('test_user');
    Simplytics.analytics.setUserProperty(name: 'prop1', value: 'value1');
  }

  void _logEvent() {
    Simplytics.analytics.logEvent(name: 'test_event');
  }

  void _logEventWithParams() {
    Simplytics.analytics
        .logEvent(name: 'test_event', parameters: {'id': 1, 'name': 'Test'});
  }

  void _logTypeSafeEvent() {
    Simplytics.analytics
        .log(PostScoreEvent(score: 7, level: 2, character: 'Dash'));
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(title: const Text('Analytics tests')),
      body: Center(
        child: SingleChildScrollView(
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.center,
            mainAxisSize: MainAxisSize.min,
            children: [
              Row(
                mainAxisAlignment: MainAxisAlignment.center,
                crossAxisAlignment: CrossAxisAlignment.center,
                children: [
                  const Text('Analytics Off'),
                  Switch(
                    value: Simplytics.analytics.isEnabled,
                    onChanged: (value) async {
                      await Simplytics.analytics.setEnabled(value);
                      setState(() {});
                    },
                  ),
                  const Text('Analytics On'),
                ],
              ),
              const Divider(),
              TextButton(
                onPressed: _logEvent,
                child: const Text('Log event'),
              ),
              TextButton(
                onPressed: _logEventWithParams,
                child: const Text('Log event with data'),
              ),
              TextButton(
                onPressed: _logTypeSafeEvent,
                child: const Text('Log type-safe event'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

// 崩溃报告示例

class ErrorDemoPage extends StatefulWidget {
  const ErrorDemoPage({super.key});

  [@override](/user/override)
  State<ErrorDemoPage> createState() => _ErrorDemoPageState();
}

class _ErrorDemoPageState extends State<ErrorDemoPage> {
  [@override](/user/override)
  void initState() {
    super.initState();

    Simplytics.crashlog.setUserId('test_user');
    Simplytics.crashlog.setCustomKey('test_key', 'test_value');
  }

  void _logError() {
    Simplytics.crashlog.log('Some log error');
  }

  void _recordError() {
    Simplytics.crashlog
        .recordError('Some error', StackTrace.current, reason: 'FakeException');
  }

  void _recordFatalError() {
    Simplytics.crashlog.recordError('Some error', StackTrace.current,
        reason: 'FakeException', fatal: true);
  }

  void _throwException() {
    throw Exception('Some exception');
  }

  void _flushCrashlytics() {
    FirebaseCrashlytics.instance.sendUnsentReports();
  }

  [@override](/user/override)
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: const Text('Error Reporting tests'),
      ),
      body: Center(
        child: SingleChildScrollView(
          child: Column(
            crossAxisAlignment: CrossAxisAlignment.center,
            mainAxisSize: MainAxisSize.min,
            children: [
              Row(
                mainAxisAlignment: MainAxisAlignment.center,
                crossAxisAlignment: CrossAxisAlignment.center,
                children: [
                  const Text('Crashlog Off'),
                  Switch(
                    value: Simplytics.crashlog.isEnabled,
                    onChanged: (value) async {
                      await Simplytics.crashlog.setEnabled(value);
                      setState(() {});
                    },
                  ),
                  const Text('Crashlog On'),
                ],
              ),
              const Divider(),
              TextButton(
                onPressed: _logError,
                child: const Text('Log error'),
              ),
              TextButton(
                onPressed: _recordError,
                child: const Text('Record error'),
              ),
              TextButton(
                onPressed: _recordFatalError,
                child: const Text('Record fatal error'),
              ),
              TextButton(
                onPressed: _throwException,
                child: const Text('Throw exception'),
              ),
              const Divider(),
              TextButton(
                onPressed: _flushCrashlytics,
                child: const Text('Flush Crashlytics'),
              ),
            ],
          ),
        ),
      ),
    );
  }
}

// 测试对话框

class TestDialog extends StatelessWidget {
  const TestDialog({super.key});

  [@override](/user/override)
  Widget build(BuildContext context) {
    return AlertDialog(
      content: const Text('Dialog', textAlign: TextAlign.center),
      alignment: Alignment.center,
      actionsAlignment: MainAxisAlignment.center,
      actions: [
        TextButton(
            onPressed: () => Navigator.pop(context),
            child: const Text('OK')),
      ],
    );
  }
}

更多关于Flutter Firebase集成插件simplytics_firebase的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html

1 回复

更多关于Flutter Firebase集成插件simplytics_firebase的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


simplytics_firebase 是一个用于 Flutter 应用的插件,旨在简化 Firebase Analytics 的集成和使用。通过这个插件,开发者可以更方便地跟踪用户行为和应用事件,而无需直接与 Firebase SDK 进行复杂的交互。

以下是如何在 Flutter 项目中集成和使用 simplytics_firebase 插件的步骤:

1. 添加依赖

首先,你需要在 pubspec.yaml 文件中添加 simplytics_firebase 插件的依赖:

dependencies:
  flutter:
    sdk: flutter
  simplytics_firebase: ^1.0.0  # 请使用最新版本

然后运行 flutter pub get 以获取依赖。

2. 配置 Firebase

在 Flutter 项目中使用 Firebase 之前,你需要先在 Firebase 控制台 中创建一个项目,并按照以下步骤进行配置:

  1. 添加 Android 和/或 iOS 应用到 Firebase 项目。
  2. 下载 google-services.json(Android)和 GoogleService-Info.plist(iOS)配置文件。
  3. 将配置文件分别放置在项目的 android/app/ios/Runner/ 目录下。

3. 初始化 Firebase

lib/main.dart 文件中初始化 Firebase:

import 'package:firebase_core/firebase_core.dart';
import 'package:flutter/material.dart';

void main() async {
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Flutter Demo',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: MyHomePage(),
    );
  }
}

4. 使用 simplytics_firebase

simplytics_firebase 插件提供了一些简单的方法来记录用户事件和屏幕视图。

记录事件

你可以使用 SimplyticsFirebase.instance.logEvent 方法来记录自定义事件:

import 'package:simplytics_firebase/simplytics_firebase.dart';

void logCustomEvent() async {
  await SimplyticsFirebase.instance.logEvent(
    eventName: 'custom_event',
    parameters: {'param1': 'value1', 'param2': 'value2'},
  );
}

记录屏幕视图

你可以使用 SimplyticsFirebase.instance.setCurrentScreen 方法来记录用户当前所在的屏幕:

void setScreenView() async {
  await SimplyticsFirebase.instance.setCurrentScreen(
    screenName: 'HomeScreen',
    screenClassOverride: 'HomeScreenWidget',
  );
}
回到顶部