背景
在之前使用Flutter开发的时候,日志输出只能用print()和debugprint(),然而这两个输出的日志都是info级别的日志,根本毫无日志分层而言,调试起来很不方便!
想法
使用Flutter调用Android和iOS的原生日志
分析
在Flutter中可以使用MethodChannel来调用原生的api
实施
Flutter
class LogUtils {
static const perform = const MethodChannel("android_log");
static void v(String tag, String message) {
perform.invokeMethod('logV', {'tag': tag, 'msg': message});
}
static void d(String tag, String message) {
perform.invokeMethod('logD', {'tag': tag, 'msg': message});
}
static void i(String tag, String message) {
perform.invokeMethod('logI', {'tag': tag, 'msg': message});
}
static void w(String tag, String message) {
perform.invokeMethod('logW', {'tag': tag, 'msg': message});
}
static void e(String tag, String message) {
perform.invokeMethod('logE', {'tag': tag, 'msg': message});
}
}
Android
class MainActivity : FlutterActivity() {
companion object {
const val FLUTTER_LOG_CHANNEL = "android_log"
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
GeneratedPluginRegistrant.registerWith(this)
MethodChannel(flutterView, FLUTTER_LOG_CHANNEL).setMethodCallHandler { call, result ->
logPrint(call)
}
}
private fun logPrint(call: MethodCall) {
var tag: String = call.argument("tag")!!
var message: String = call.argument("msg")!!
when (call.method) {
"logV" -> Log.v(tag, message)
"logD" -> Log.d(tag, message)
"logI" -> Log.i(tag, message)
"logW" -> Log.w(tag, message)
"logE" -> Log.e(tag, message)
}
}
}
结果