[Flutter]printだと長い文字列が省略されてしまう問題

Flutter

はじめに

先日、Flutterで開発して長い文字列をprintで表示しようと思って使った所、最後の部分が<…>と省略されてしまう問題が発生しました。

今回はこの問題の回避策を紹介します。

環境

  • Flutter 2.5.3

現象

下記のような長い文字列があったとします。

あああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああいうえお

これを下記のようにprintを使ってコンソールにログを表示すると。。。

    print(
        "あああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああいうえお");
flutter: あああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああ<…>

このように最後の部分が「<…>」と省略されて表示されてしまいます。

これはprintを利用して標準出力した場合は1024byteの制限がかかっているため、1024byte以上の部分が省略されてしまいます。

これはFlutterの出力関数であるdebugPrintを利用しても同じ現象になります。

debugPrint property - foundation library - Dart API
API docs for the debugPrint property from the foundation library, for the Dart programming language.

対策方法

方法は今の所2つかなと思います。

logを使う

dart:developerにあるlogです。

log function - dart:developer library - Dart API
API docs for the log function from the dart:developer library, for the Dart programming language.

使い方はこんな感じです。

import 'dart:developer';

    log("あああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああいうえお");

すると。。。

[log] あああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああいうえお

無事、正しく表示されました!

しかもlog()はタグ付けや、DateTimeやerrorやStack Traceなど様々ものを設定でき、ログを自分の好きなようにカスタマイズできるのでかなり便利です。

唯一欠点なのはprint等混合して使ってしまうとログの順番が前後してしまいます。

そこさえ気をつければ、これが良いかもしれません。

文字列を分割

こんな感じのクラスを作って

class DebugExt {
  DebugExt._();

  static void log(
    dynamic object, {
    int length = 330,
  }) {
    final str = object.toString();
    for (int i = 0; i < str.length; i += length) {
      print(str.substring(i, min(i + length, str.length)));
    }
  }
}

使ってみると

    DebugExt.log(
        "あああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああいうえお");

以下のように2つに分割されて表示されます。

flutter: ああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああああ
flutter: あああいうえお

なぜ330にしているのかというと日本語は1文字が3byteのデータになるので330文字で制限の少し手前になるからです。

このやり方はあまりクールじゃない気がします。

さいごに

ログ系はプラグインもあるので今度はそっちを使って調査してみようと思います。

おすすめ参考書

コメント

タイトルとURLをコピーしました