Flutter Firebase集成插件simplytics_firebase的使用
Flutter Firebase集成插件simplytics_firebase的使用
Simplytics
是一个用于分析和崩溃报告的简单抽象层。此包为 Simplytics
添加了对 Firebase Analytics
和 Crashlytics
服务的支持。
使用
要开始在 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
更多关于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 控制台 中创建一个项目,并按照以下步骤进行配置:
- 添加 Android 和/或 iOS 应用到 Firebase 项目。
- 下载
google-services.json
(Android)和GoogleService-Info.plist
(iOS)配置文件。 - 将配置文件分别放置在项目的
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',
);
}