Flutter実戦のカスタムログ印刷コンポーネント
9437 ワード
前言
Flutterでは、ログを印刷する必要がある場合、カスタマイズしない場合は、独自の
出力されるログレベルを明確にするにはどうすればいいですか?
別の方法では、Flutterコードで元のAndroidのLogコンポーネントを呼び出すことができれば、ログ印刷の問題を解決できるのではないでしょうか.
関連付け方法
Flutterでは、
ここで簡単に説明すると、Flutterは特定のプラットフォームのAPIについて、主にその柔軟なメッセージング方式に依存して実行され、完全なコード生成ではない.どういう意味ですか.Flutterはプラットフォーム通路を通じて宿主(Android、IOS)にメッセージを送ることができる. ホストはプラットフォームチャネルを傍受し、送信されたメッセージを受信する. ホストプラットフォームは、受信したメッセージを介してホスト固有のAPIを実行し、応答結果をクライアント(つまり、Flutter部)更新状態に戻す.
コードで簡単に説明します.Step 1:Flutterプラットフォームクライアントの作成 Step 2:宿主側が対応チャネル受信側を確立
上のStep 3:そして宿主のM Step 4:FlutterでLogUtils関連メソッドを呼び出し、ログを印刷します.
コンソールから出力される印刷結果は次のとおりです.
これで,簡単なログ印刷の構築が完了した.
締めくくり
現在、Flutterの多くは元のプラットフォームAPIのサポートが必要であり、我々は完全に良い
Tips
Flutterログ印刷について、コメントエリアではdevtoolsについてログの印刷について、ここの説明devtools/loggingを見てもいいです.
転載先:https://juejin.im/post/5c8cf49e51882575eb6ad6ac
Flutterでは、ログを印刷する必要がある場合、カスタマイズしない場合は、独自の
print()
またはdebugPrint()
方法で印刷するしかありませんが、この2つの印刷は、ログがデフォルトInfo
レベルのログであり、友好的ではありませんので、ログ印刷レベルが明確である必要がある場合は、ログ印刷コンポーネントをカスタマイズする必要があります.ログ印刷コンポーネントをカスタマイズする方法について説明します.出力されるログレベルを明確にするにはどうすればいいですか?
別の方法では、Flutterコードで元のAndroidのLogコンポーネントを呼び出すことができれば、ログ印刷の問題を解決できるのではないでしょうか.
関連付け方法
Flutterでは、
MethodChannel
を使用して関連付けを行い、Android、IOSなどの特定プラットフォームの関連APIをFlutterに呼び出すことができます.MethodChannel
の使用説明と関連紹介については、公式ドキュメントを参照してください.ここで簡単に説明すると、Flutterは特定のプラットフォームのAPIについて、主にその柔軟なメッセージング方式に依存して実行され、完全なコード生成ではない.どういう意味ですか.
コードで簡単に説明します.
import 'package:flutter/services.dart';
///
class LogUtils {
LogUtils._();
// : ,
static const _platform = const MethodChannel('com.yancy.flutter.plugins/log');
// ,
//invokeMethod , , ;
static void i(String tag, String msg) {
_platform.invokeMethod('logI', {'tag': tag, 'msg': msg});
}
static void d(String tag, String msg) {
_platform.invokeMethod('logD', {'tag': tag, 'msg': msg});
}
static void v(String tag, String msg) {
_platform.invokeMethod('logV', {'tag': tag, 'msg': msg});
}
static void w(String tag, String msg) {
_platform.invokeMethod('logW', {'tag': tag, 'msg': msg});
}
static void e(String tag, String msg) {
_platform.invokeMethod('logE', {'tag': tag, 'msg': msg});
}
}
package com.yancy.flutter.host;
import android.content.Context;
import android.util.Log;
import android.widget.Toast;
import io.flutter.plugin.common.BinaryMessenger;
import io.flutter.plugin.common.MethodChannel;
/**
* :
*
* @author Yancy
* @date 2019/3/15
*/
public class CustomFlutterPlugins {
// Flutter ,
private static final String LOG_CHANNEL_NAME = "com.yancy.flutter.plugins/log";
public static void registerLogger(BinaryMessenger messenger) {
new MethodChannel(messenger, LOG_CHANNEL_NAME).setMethodCallHandler((methodCall, result) -> {
String tag = methodCall.argument("tag");
String msg = methodCall.argument("msg");
switch (methodCall.method) {
case "logV":
Log.v(tag, msg);
break;
case "logD":
Log.d(tag, msg);
break;
case "logI":
Log.i(tag, msg);
break;
case "logW":
Log.w(tag, msg);
break;
case "logE":
Log.e(tag, msg);
break;
default:
Log.d(tag, msg);
break;
}
});
}
}
上の
switch
奥の部分がflutter中invokeMethod
メソッドの最初のパラメータ名です.ainActivity
で呼び出し登録をすればチャネルの確立が完了する.public class MainActivity extends FlutterActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
GeneratedPluginRegistrant.registerWith(this);
CustomFlutterPlugins.registerLogger(getFlutterView());
}
}
class MyApp extends StatelessWidget {
@override
Widget build(BuildContext context) {
print('print------');
debugPrint('debugPrint-----');
LogUtils.v('yancy', 'v-------');
LogUtils.d('yancy', 'd-------');
LogUtils.i('yancy', 'i-------');
LogUtils.w('yancy', 'w-------');
LogUtils.e('yancy', 'e-------');
return MaterialApp(
title: 'Flutter Demo',
theme: ThemeData(
primarySwatch: Colors.blue,
),
home: MyHomePage(title: 'Flutter Demo Home Page'),
);
}
}
コンソールから出力される印刷結果は次のとおりです.
これで,簡単なログ印刷の構築が完了した.
締めくくり
現在、Flutterの多くは元のプラットフォームAPIのサポートが必要であり、我々は完全に良い
MethodChannel
関連機能の開発を行うことができ、例えばFlutterでtoastのヒントに対して、現在持っているのはSnackBar
コンポーネントであり、Androidが持っているToast
を使用するには、本明細書で同様の方法でパッケージすることができる.Tips
Flutterログ印刷について、コメントエリアではdevtoolsについてログの印刷について、ここの説明devtools/loggingを見てもいいです.
転載先:https://juejin.im/post/5c8cf49e51882575eb6ad6ac