如何在 Flutter 中启用/禁用 Firebase Crashlytics

Posted

技术标签:

【中文标题】如何在 Flutter 中启用/禁用 Firebase Crashlytics【英文标题】:How to enable/disable Firebase Crashlytics in Flutter 【发布时间】:2020-10-04 16:30:35 【问题描述】:

我正在尝试在我的 Flutter 应用中实现选择加入机制,用户可以选择启用/禁用将 Crashlytics 数据从他们的设备发送到我的 Firebase 控制台。

阅读这篇文章https://firebase.google.com/docs/crashlytics/customize-crash-reports?platform=android#enable-reporting,我发现您最初可以通过AndroidManifest 文件禁用它,并且可以通过以下代码在运行时禁用它:

FirebaseCrashlytics.getInstance().setCrashlyticsCollectionEnabled(true)

但是,我很难找到类似的 dart 代码来访问类似的功能。

注意:顺便说一下,我正在使用 Flutter 的 firebase_crashlytics 插件。

【问题讨论】:

【参考方案1】:

首先,您需要一个类似全局变量的东西,例如enableCrashlytics 来指示是否应将此崩溃发送到 Firebase。然后在FlutterError.onError 中使用该变量,如下所示:

FlutterError.onError = (details)
    if(enableCrashlytics) 
      enableCrashlytic = false;
      Crashlytics.instance.recordFlutterError(details);
     else
      //Do nothing
    
  ;

【讨论】:

谢谢!!!这是一些很棒的见解。只是为了确认一下,我可以在 AndroidManifest 文件中默认启用 Crashlytics,任何应该发送到控制台的 Flutter 错误都应该通过这个条件来判断它是否可以发送,对吗?另外,这与 runZoned 的 onError 参数有什么不同吗? 其实我认为你根本不需要遵循指令here。只需遵循 firebase_crashlytic 插件的集成说明,它应该是自动记录崩溃就好了。关于onError in runZoned:您还应该在runZoned 中捕获错误,这是捕获由异步执行代码引起的所有错误的地方。您可以启用/禁用 Firebase 报告,就像我发布的代码 sn-p 一样。 我对您为 runZoned 提供的语法进行了一些小的修改。似乎进展顺利!再次感谢,因为这个,我的项目实际上陷入了低谷。你是救生员:)【参考方案2】:

调用setCrashlyticsCollectionEnabled 方法来切换Crashlytics 收集状态。

例如,要确保在您的应用处于调试模式时将其禁用,您可以执行以下操作:

if (kDebugMode) 
  // Force disable Crashlytics collection while doing every day development.
  // Temporarily toggle this to true if you want to test crash reporting in your app.
  await FirebaseCrashlytics.instance
      .setCrashlyticsCollectionEnabled(false);
 else 
  // Handle Crashlytics enabled status when not in Debug,
  // e.g. allow your users to opt-in to crash reporting.

完整示例

// Toggle this for testing Crashlytics in your app locally.
const _kTestingCrashlytics = true;


void main() async 
  WidgetsFlutterBinding.ensureInitialized();
  await Firebase.initializeApp();

  runZonedGuarded(() 
    runApp(MyApp());
  , FirebaseCrashlytics.instance.recordError);


class _MyAppState extends State<MyApp> 
  Future<void> _initializeFlutterFireFuture;
  
  // Define an async function to initialize FlutterFire
  Future<void> _initializeFlutterFire() async 
    // Wait for Firebase to initialize

    if (_kTestingCrashlytics) 
      // Force enable crashlytics collection enabled if we're testing it.
      await FirebaseCrashlytics.instance.setCrashlyticsCollectionEnabled(true);
     else 
      // Else only enable it in non-debug builds.
      // You could additionally extend this to allow users to opt-in.
      await FirebaseCrashlytics.instance
          .setCrashlyticsCollectionEnabled(!kDebugMode);
    

    // Pass all uncaught errors to Crashlytics.
    Function originalOnError = FlutterError.onError;
    FlutterError.onError = (FlutterErrorDetails errorDetails) async 
      await FirebaseCrashlytics.instance.recordFlutterError(errorDetails);
      // Forward to original handler.
      originalOnError(errorDetails);
    ;
  

  @override
  void initState() 
    super.initState();
    _initializeFlutterFireFuture = _initializeFlutterFire();
  

【讨论】:

以上是关于如何在 Flutter 中启用/禁用 Firebase Crashlytics的主要内容,如果未能解决你的问题,请参考以下文章

如何在颤动中禁用 texformfield 输入?

在 Audio_Service Flutter 中启用或禁用锁屏艺术

我该如何解决这个问题:Android Studio - Flutter - Dart - firebase [关闭]

Flutter :启用文本字段时,背景图像向上移动。 “resizeToAvoidBottomInset”禁用滚动。我哪里错了?

禁用桌面支持 Flutter

在 TextFormField Flutter 的值更改时禁用 AlertDialog 按钮