Flutter実戦のカスタムログ印刷コンポーネント

9437 ワード

前言
Flutterでは、ログを印刷する必要がある場合、カスタマイズしない場合は、独自のprint()またはdebugPrint()方法で印刷するしかありませんが、この2つの印刷は、ログがデフォルトInfoレベルのログであり、友好的ではありませんので、ログ印刷レベルが明確である必要がある場合は、ログ印刷コンポーネントをカスタマイズする必要があります.ログ印刷コンポーネントをカスタマイズする方法について説明します.
出力されるログレベルを明確にするにはどうすればいいですか?
別の方法では、Flutterコードで元のAndroidのLogコンポーネントを呼び出すことができれば、ログ印刷の問題を解決できるのではないでしょうか.
関連付け方法
Flutterでは、MethodChannelを使用して関連付けを行い、Android、IOSなどの特定プラットフォームの関連APIをFlutterに呼び出すことができます.MethodChannelの使用説明と関連紹介については、公式ドキュメントを参照してください.
ここで簡単に説明すると、Flutterは特定のプラットフォームのAPIについて、主にその柔軟なメッセージング方式に依存して実行され、完全なコード生成ではない.どういう意味ですか.
  • Flutterはプラットフォーム通路を通じて宿主(Android、IOS)にメッセージを送ることができる.
  • ホストはプラットフォームチャネルを傍受し、送信されたメッセージを受信する.
  • ホストプラットフォームは、受信したメッセージを介してホスト固有のAPIを実行し、応答結果をクライアント(つまり、Flutter部)更新状態に戻す.

  • コードで簡単に説明します.
  • Step 1:Flutterプラットフォームクライアントの作成
  • 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});
      }
    
    }
    
  • Step 2:宿主側が対応チャネル受信側を確立
  • 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メソッドの最初のパラメータ名です.
  • Step 3:そして宿主のMainActivityで呼び出し登録をすればチャネルの確立が完了する.
  • public class MainActivity extends FlutterActivity {
      @Override
      protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        GeneratedPluginRegistrant.registerWith(this);
    
        CustomFlutterPlugins.registerLogger(getFlutterView());
      }
    }
    
  • Step 4:FlutterでLogUtils関連メソッドを呼び出し、ログを印刷します.
  • 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