Flutter部署
环境要求
- Dart Version:2.4.0及以上
- Flutter Version:1.12.0及以上
嵌码步骤
Flutter嵌码分为两个部分:原生项目嵌码和Flutter插件嵌码。
原生项目嵌码
请确保嵌码App原生部分已集成基调听云SDK,如未集成可参照原生项目部署文档完成嵌码。
- 
说明:由于Flutter插件嵌码会通过 pod install 引入 iOS SDK,所以请从 添加基调听云SDK步骤开始嵌码。
Flutter 插件嵌码
添加依赖
- 添加依赖 - 在项目的pubspec.yaml文件中添加基调听云Flutter插件,目前支持远程依赖及本地依赖两种部署方式。 - 远程依赖 - dependencies: tingyun_flutter_plugin: ^1.0.0
- 本地依赖 - dependencies: tingyun_flutter_plugin: path: tingyun_flutter_plugin //tingyun_flutter_plugin 需替换为本地 TingYun flutter 插件的目录
 
- 获取插件 - 添加依赖后需要在项目「根目录下」执行 - flutter packages get命令。- 说明:iOS 添加依赖需在项目 - ios目录下执行- pod install命令。
Flutter 插件初始化
- 替换 runApp() - 需注释原有的 - runApp()方法,并添加- Tingyun().start(MyApp()方法。- import 'package:tingyun_flutter_plugin/tingyun_flutter_plugin.dart'; void main() { // runApp(MyApp()); Tingyun().start(MyApp()); }
- 运行日志 - 运行项目工程后控制台会显示以下日志: - tingyun flutter impl start get configure from tingyun:xxx //xxx 为从 native 端 SDK 获取到的功能开关配置情况 //初始化成功时候显示 tingyun flutter plugin success! //初始化失败时显示 tingyun flutter plugin failed to initialize. Error: xxx //xxx 为错误描述
兼容异常数据
由于 Flutter 只允许单一 handler 收集 error 数据,基调听云提供了相关参数以便兼容 App 自身采集 error 的场景。
- 控制参数 - 我们在 - tingyun_flutter_plugin初始化方法中提供了两个参数,您可以选择传入相关函数来处理 error。- /** 因为flutter error 的捕获机制原因,需要提供2个不同的函数来进行处理, onError 是flutter框架没有捕获到的异常的时候,通过runZoned来捕获的error的回调函数 flutterOnError 是flutter框架通过Flutter.onError来捕获异常的回调函数 @onError: 需要传入原型为 void FunctiononError(Object, StackTrace)的函数, @flutterOnError: 需要传入原型为 void FunctionFlutterError(FlutterErrorDetails details)的函数 */ Tingyun().start(MyApp(), {Function onError, Function flutterOnError});
- 代码示例 - void main() => Tingyun().start(MyApp(),onError: onCustomError, flutterOnError: onCustomFlutterError); void onCustomError(Object object, BuildContext stackTrace){ print('onCustomError happened'); } void onCustomFlutterError(FlutterErrorDetails details){ print('onCustomFlutterError happened'); }
Android WebView 数据采集
由于操作系统差异,基调听云 iOS SDK 默认支持自动采集 WebView 数据,Android 则需按以下步骤添加相关设置。目前支持自动注入 JS 探针和手动注入 JS 探针两种方式。
- 自动注入 JS 探针 - 需在初始化 SDK 时调用 isHookWebChromeClient(true),SDK 将自动替换 WebChromeClient 并注入 JS 探针。 
- 示例 
 ```
 NBSAppAgent.setLicenseKey("Key").setRedirectHost("Host")
            .isHookWebChromeClient(true) // 自动替换 WebChromeClient 并注入 JS 探针
            .start(getApplicationContext());
 ```
- 手动注入 JS 探针 - 需要在 WebChromeClient 中调用基调听云Android SDK 提供的 initJSMonitor() 方法。 
- 示例 - 以【 webview_flutter-0.3.24】为例。 - 打开 webview_flutter-0.3.24 android 目录下的 build.gradle 文件并添加 TingYun_Android_SDK 依赖。 - dependencies { compileOnly "com.networkbench:tingyun-ea-agent-android:2.15.5" }
- 在 WebChromeClient 中重写 onProgressChanged(),并添加 TingYun_SDK 的 initJSMonitor() 方法。 - private class FlutterWebChromeClient extends WebChromeClient { @Override public void onProgressChanged(WebView view, int newProgress) { try { Class.forName("com.networkbench.agent.impl.instrumentation.NBSWebChromeClient"); com.networkbench.agent.impl.instrumentation.NBSWebChromeClient.initJSMonitor(view, newProgress); } catch (ClassNotFoundException e) { e.printStackTrace(); } super.onProgressChanged(view, newProgress); } ... ... }