【移动应用开发技术】如何在Flutter中捕获错误_第1页
【移动应用开发技术】如何在Flutter中捕获错误_第2页
【移动应用开发技术】如何在Flutter中捕获错误_第3页
【移动应用开发技术】如何在Flutter中捕获错误_第4页
【移动应用开发技术】如何在Flutter中捕获错误_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

【移动应用开发技术】如何在Flutter中捕获错误

这期内容当中在下将会给大家带来有关如何在Flutter中捕获错误,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Demo初始状态首先我们新建Flutter项目,修改main.dart代码如下:import

'package:flutter/material.dart';

void

main()

=>

runApp(MyApp());

class

MyApp

extends

StatelessWidget

{

//

This

widget

is

the

root

of

your

application.

@override

Widget

build(BuildContext

context)

{

return

MaterialApp(

home:

Scaffold(

appBar:

AppBar(title:

Text('Flutter

Crash

Capture'),),

body:

MyHomePage(),

),

);

}

}

class

MyHomePage

extends

StatelessWidget

{

@override

Widget

build(BuildContext

context)

{

return

Container();

}

}效果如下:捕获错误我们修改MyHomePage,添加一个List然后进行越界访问,改动部分代码如下:class

MyHomePage

extends

StatelessWidget

{

@override

Widget

build(BuildContext

context)

{

List<String>

numList

=

['1',

'2'];

print(numList[6]);

return

Container();

}

}可以看到控制台报错如下:flutter:══╡EXCEPTIONCAUGHTBYWIDGETSLIBRARY╞═══════════════════════════════════════════════════════════flutter:ThefollowingRangeErrorwasthrownbuildingMyHomePage(dirty):flutter:RangeError(index):Invalidvalue:Notinrange0..1,inclusive:6flutter:══╡EXCEPTIONCAUGHTBYWIDGETSLIBRARY╞═══════════════════════════════════════════════════════════flutter:ThefollowingRangeErrorwasthrownbuildingMyHomePage(dirty):flutter:RangeError(index):Invalidvalue:Notinrange0..1,inclusive:6当然这些错误信息在界面上也有显示(debug模式)。那么我们如何捕获呢?其实很简单,有个通用模板,模板为:import

'dart:async';

import

'package:flutter/material.dart';

Future<Null>

main()

async

{

FlutterError.onError

=

(FlutterErrorDetails

details)

async

{

Zone.current.handleUncaughtError(details.exception,

details.stack);

};

runZoned<Future<void>>(()

async

{

runApp(MyApp());

},

onError:

(error,

stackTrace)

async

{

await

_reportError(error,

stackTrace);

});

}

Future<Null>

_reportError(dynamic

error,

dynamic

stackTrace)

async

{

//

TODO

}在TODO里面就可以执行埋点上报操作或者其他处理了。完整例子如下:import

'dart:async';

import

'package:flutter/material.dart';

Future<Null>

main()

async

{

FlutterError.onError

=

(FlutterErrorDetails

details)

async

{

Zone.current.handleUncaughtError(details.exception,

details.stack);

};

runZoned<Future<void>>(()

async

{

runApp(MyApp());

},

onError:

(error,

stackTrace)

async

{

await

_reportError(error,

stackTrace);

});

}

Future<Null>

_reportError(dynamic

error,

dynamic

stackTrace)

async

{

print('catch

error='+error);

}

class

MyApp

extends

StatelessWidget

{

//

This

widget

is

the

root

of

your

application.

@override

Widget

build(BuildContext

context)

{

return

MaterialApp(

home:

Scaffold(

appBar:

AppBar(title:

Text('Flutter

Crash

Capture'),),

body:

MyHomePage(),

),

);

}

}

class

MyHomePage

extends

StatelessWidget

{

@override

Widget

build(BuildContext

context)

{

List<String>

numList

=

['1',

'2'];

print(numList[6]);

return

Container();

}

}运行可以看到控制台捕获到错误如下:flutter:catcherror=RangeError(index):Invalidvalue:Notinrange0..1,inclusive:6flutter:catcherror=RangeError(index):Invalidvalue:Notinrange0..1,inclusive:6assert妙用我们知道,一般错误上报都是在打包发布到市场后才需要。平时调试的时候如果遇到错误,我们是会定位问题并修复的。因此在debug模式下,我们不希望上报错误,而是希望直接打印到控制台。那么,这个时候就需要一种方式来区分现在是debug模式还是release模式,怎么区分呢?这个时候就需要用到assert了。bool

get

isInDebugMode

{

//

Assume

you're

in

production

mode.

bool

inDebugMode

=

false;

//

Assert

expressions

are

only

evaluated

during

development.

They

are

ignored

//

in

production.

Therefore,

this

code

only

sets

`inDebugMode`

to

true

//

in

a

development

environment.

assert(inDebugMode

=

true);

return

inDebugMode;

}从注释也可以知道,assert表达式只在开发环境下会起作用,在生产环境下会被忽略。因此利用这一个,我们就可以实现我们的需求。上面的结论要验证也很简单,我们就不演示了。完整模板import

'dart:async';

import

'package:flutter/material.dart';

Future<Null>

main()

async

{

FlutterError.onError

=

(FlutterErrorDetails

details)

async

{

if

(isInDebugMode)

{

FlutterError.dumpErrorToConsole(details);

}

else

{

Zone.current.handleUncaughtError(details.exception,

details.stack);

}

};

runZoned<Future<void>>(()

async

{

runApp(MyApp());

},

onError:

(error,

stackTrace)

async

{

await

_reportError(error,

stackTrace);

});

}

Future<Null>

_reportError(dynamic

error,

dynamic

stackTrace)

async

{

//

TODO

}

bool

get

isInDebugMode

{

//

Assume

you're

in

production

mode.

bool

inDebugMode

=

false;

//

Assert

exp

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论