【问题标题】:How to enable/disable Firebase Crashlytics in Flutter如何在 Flutter 中启用/禁用 Firebase Crashlytics
【发布时间】: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 插件。

【问题讨论】:

    标签: firebase flutter crashlytics firebase-crash-reporting


    【解决方案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();
      }
    }
    

    【讨论】:

      猜你喜欢
      • 2018-09-02
      • 1970-01-01
      • 2021-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多