有什么方法可以在共享偏好崩溃之前保存数据吗?只有在发生崩溃时,我才会搜索禁用函数。因此,要禁用该功能,我需要检测崩溃。我想用崩溃分析来实现这一点,这有可能吗?
我试图模拟崩溃,但没有调用catch (error):
try {
       
        FirebaseCrashlytics.instance.crash();
      } catch (error) {
        prefs.setBool("crash",true);
      }发布于 2022-11-07 05:54:13
从文件中:
FirebaseCrashlytics.instance.crash();
您的应用程序应该在调用此方法后立即退出。在崩溃后再次打开应用程序后,Firebase Crashlytics会将崩溃报告上传到Firebase控制台。
因此,它不让catch方法被调用,它只是立即崩溃应用程序。
一个解决办法是采用这样的方法:
testingCrash(){
prefs.setBool("crash",true);
some code that may or may not cause a crash...
prefs.setBool("crash",false); //If the line is executed and true is stored in 'crash' then you can be sure the code did not cause any crash
}然后,在应用程序的每次启动时,您都可以在initState()方法中检查prefs.getBool('crash')是否是true,如果是,那么上次prefs.getBool('crash')没有成功成为false,因此就出现了崩溃。
发布于 2022-11-03 10:43:05
模拟错误的代码的问题是,您必须等待崩溃的发生-如下所示:
      try {
        await crashFunction();
      } catch (error) {
        prefs.writeBool(key: "crash", value: true);
      }在这种情况下,catch块将工作。
FirebaseCrashlytics.instance.crash();会触发终止崩溃的本地应用程序,所以我认为这就是为什么catch在这种情况下不能工作的原因--它无法捕捉到此类崩溃。您应该使用try catch来处理Dart/颤振异常,而不是本机崩溃-它不会那样工作。
关于您的问题--您不能在崩溃之前记录任何内容--因为您不知道什么时候会发生崩溃--但是您确实可以在catch块中完成(如果崩溃不是应用程序终止的话(但即使在这种情况下,也有一些执行逻辑的方法))。
解决这个问题的方法可能是一个广泛的日志记录系统,因此您可以记录您所需要的一切,而不考虑崩溃的发生。它可能看上去过于冗长,但它是在崩溃之前记录某件事情的唯一可能方法--记录所有的一切和任何地方。
如果要在catch块中获得更多信息,可以使用如下所示的catch的另一个覆盖:
try{
...
} catch (error, stacktrace){
//save to sharedprefs
}在这种情况下,您可以存储完整的堆栈跟踪,而不仅仅是错误描述。
此外,您还可以在以下帮助下捕获特定错误:
try{
} on SomeException catch(error){
}此覆盖将只捕获SomeException的实例,其他所有实例都将被抛出。
如果你想捕捉到一个终止错误的应用程序--我不认为有一种方法可以一笔勾销--但可以肯定的是,有一种方法可以像here在安卓平台上描述的那样,在本地平台上实现。
希望它能帮上忙
发布于 2022-11-07 06:58:07
到目前为止,我得到的帮助如下:也许会有帮助!
class MyError extends Error {
  final dynamic data;
  final String? message;
  MyError(this.data, this.message);
  void storeError() {
    //Any Operation Can be done here
  }
  String toString() {
    var message = this.message;
    //Call this method in extension function to access there could be many ways to do so
    storeError();
    return (message != null) ? "MyError: $message" : "MyError";
  }
}为崩溃后的指定操作创建自定义错误类:
用法:
try {
      throw MyError({"testingData": "TestError"}, "Error Kind");
    } catch (error) {
      Logger.log("Crash Crash Crash", error.toString());
    }https://stackoverflow.com/questions/74267630
复制相似问题