dart|技术实践第二期|Flutter异常捕获( 二 )


Flutter 框架为我们在很多关键的方法进行了异常捕获 。 如果我们想自己上报异常 , 只需要提供一个自定义的错误处理回调即可 , 如:
void main() {FlutterError.onError = (FlutterErrorDetails details) {reportError(details);;... 有没有一套从天而降的代码 , 能够统一处理以上异常呢?
3.总结(一套代码捕获所有异常)
runZonedGuarded(() async {WidgetsFlutterBinding.ensureInitialized();FlutterError.onError = (FlutterErrorDetails details) {myErrorsHandler.onError(details.exception , details.stack);;runApp(MyApp()); (Object error StackTrace stack) {myErrorsHandler.onError(error stack);); 代码中出现了一句 , 上诉从没有出现过的代码即WidgetsFlutterBinding.ensureInitialized() , 当我把这行代码注释掉的时候 , 框架异常是捕获不到的 。
当时困扰了好久最后终于查到了原因:

上图是Flutter的架构层 , WidgetFlutterBinding用于与 Flutter 引擎交互 。我们的APM产品需要调用 native 代码来初始化 , 并且由于插件需要使用平台 channel 来调用 native 代码 , 这是异步完成的 , 因此必须调用ensureInitialized()确保你有一个 WidgetsBinding 的实例.
来自 docs :
Returns an instance of the WidgetsBinding creating and initializing it if necessary. If one is created it will be a WidgetsFlutterBinding. If one was previously initialized then it will at least implement WidgetsBinding.
注:如果你的应用在runApp 中调用了 WidgetsFlutterBinding.ensureInitialized() 方法来进行一些初始化操作 , 则必须在runZonedGuarded中调用WidgetsFlutterBinding.ensureInitialized()
六、异常上报 异常上报的整体方案是通过已有的插件增加接口 , 桥接Android APM 和 iOS APM库的自定义异常上报接口 。
插件增加函数
static void postException(error stack) {List args = [errorstack
;//将异常和堆栈上报至umapm_channel.invokeMethod(\"postException\"args); Android 端调用自定义异常上报:
private void postException(List args){String error = (String)args.get(0);String stack = (String)args.get(1);UMCrash.generateCustomLog(stackerror); iOS端调用自定义异常上报:
if ([@\"postException\" isEqualToString:call.method
){NSString* error = arguments[0
;NSString* stack = arguments[1
;[UMCrash reportExceptionWithName:@\"Flutter\" reason:error stackTrace:stack terminateProgram:NO
; 以上就是本期干货内容的介绍 , 希望我们的技术内容可以更好地帮助开发者们解决问题 , 我们将陪伴开发者们一起进步 , 一起成长 。
作者:友盟+技术专家 彦克
本文为阿里云原创内容 , 未经允许不得转载 。

相关经验推荐