emas_crashlytics 0.0.1 emas_crashlytics: ^0.0.1 copied to clipboard
flutter crashlytics
import 'package:flutter/material.dart';
import 'package:flutter/cupertino.dart';
import 'dart:async';
import 'package:emas_crashlytics/emas_crashlytics.dart';
import './ErrorTriggert.dart';
void main() {
// 收集 Flutter Framework 异常
FlutterError.onError = (FlutterErrorDetails details) async {
// 将异常转发至 Zone 统一处理
Zone.current.handleUncaughtError(details.exception,
details.stack ?? StackTrace.fromString(details.toString()));
};
// 收集异步触发的 Dart 异常
runZonedGuarded(() {
runApp(MyApp());
}, (Object error, StackTrace stackTrace) {
// debugPrint 不会截断:https://flutterchina.club/debugging/#printdebugprintflutter-logs
// debugPoint 可自定义:https://zhuanlan.zhihu.com/p/99917712
// debugPrint(error.toString());
// debugPrint(stackTrace.toString());
// 上报异常
EmasCrashlytics.instance
.captureException(error: error, stackTrace: stackTrace)
.then((bool result) {
print('采集到异常,上报${result ? '成功' : '失败'},result:$result');
});
});
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
return MaterialApp(home: Home(), navigatorObservers: <NavigatorObserver>[
EmasNavigatorObserver.instance
]);
}
}
class Home extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('EMAS 异常上报 Demo'),
),
body: Column(
children: <Widget>[
ErrorTrigger(),
Divider(
color: Colors.black,
height: 30,
),
RaisedButton(
onPressed: () async {
Navigator.push(
context,
MaterialPageRoute<void>(
settings: const RouteSettings(name: '/second'),
builder: (BuildContext context) => Second(),
),
);
},
child: Text('去子页面:/second')),
],
));
}
}
/// 子路由
class Second extends StatelessWidget {
@override
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('Second 子路由'),
),
body: Column(
children: <Widget>[
ErrorTrigger(),
Divider(
color: Colors.black,
height: 30,
),
Text('子路由:/second\n上报的错误将携带 /second 路由标识',
style: TextStyle(fontSize: 16)),
],
));
}
}