フラッターアプリケーションがデバッグで実行されていることを確認する方法は?


100

短い質問があります。アプリがデバッグモードのときにFlutterでコードを実行する方法を探しています。Flutterでそれは可能ですか?ドキュメントのどこにも見つからないようです。

このようなもの

If(app.inDebugMode) {
   print("Print only in debug mode");
}

Flutterアプリケーションがデバッグモードまたはリリースモードで実行されているかどうかを確認するにはどうすればよいですか?



1
assert((){print( "Debug mode"); return true;});を試しました。しかし、それは私にコンパイルできないエラーを与えるだけです。彼らが投稿の後半で話している「プロフィール」は、私にはあまり意味がありません。使い方を教えてください。
ケビンウォルター

回答:


33

これは機能しますが、定数kReleaseModeまたはを使用するkDebugModeことをお勧めします。完全な説明については、以下のレミの回答を参照してください。これはおそらく受け入れられる質問です。


最も簡単な方法はassert、デバッグモードでのみ実行されるため使用することです。

Flutterのナビゲーターのソースコードの例を次に示します。

assert(() {
  if (navigator == null && !nullOk) {
    throw new FlutterError(
      'Navigator operation requested with a context that does not include a Navigator.\n'
      'The context used to push or pop routes from the Navigator must be that of a '
      'widget that is a descendant of a Navigator widget.'
    );
  }
  return true;
}());

特に、()呼び出しの最後にあることに注意してください。assertはブール値でのみ動作できるため、関数を渡すだけでは機能しません。


1
「特に注意」は私のIDEがつまずいた部分でした。どうもありがとうございます!
ケビンウォルター

5
あなたが書くとき、あなた() { .... }は関数を定義していますが、それを呼び出していません。()実際に追加すると、関数が呼び出されます。
rmtmckenzie 2018年

269

アサートは技術的には機能しますが、使用しないでください。

代わりに、kReleaseModeからの定数を使用してくださいpackage:flutter/foundation.dart


違いはすべて木の揺れです

ツリーの揺れ(コンパイラが未使用のコードを削除すること)は、変数が定数であることに依存します。

問題は、isInReleaseModeブール値が定数ではないと断言することです。そのため、アプリを出荷するときに、開発コードとリリースコードの両方が含まれています。

一方、kReleaseMode 定数です。したがって、コンパイラは未使用のコードを正しく削除でき、安全に次のことができます。

if (kReleaseMode) {

} else {
  // Will be tree-shaked on release builds.
}

29
ただ、小さなサイドノートとしても、未知のとあなたのクラスの汚染を避けるためには、次のようにインポートしimport 'package:flutter/foundation.dart' as Foundation;、あなたが行うことができますFoundation. kReleaseMode
オリバー・ディクソン

3
レミを説明してくれてありがとう-私は主張する代わりにこれを選びました-良いものです!
フレッド

1
これはこれまでのところどうですか、これは受け入れられた答えになるはずです!
Empty2k 1219

5
また、あります kDebugMode
アレクサンドルスクヴォルツォフ

1
ウィジェットでも木の揺れは起こりますか?したがって、visibilityウィジェットをvisible:kDebugModeで実行した場合、そのウィジェットはリリースビルド用にコンパイラーによって削除されますか?
WiteCastle

56

この小さなスニペットはあなたが必要なことをするはずです

bool get isInDebugMode {
  bool inDebugMode = false;
  assert(inDebugMode = true);
  return inDebugMode;
}

そうでない場合はmain.dart、ブール値を設定できるデバッグモードで別のモードを起動するようにIDEを構成できます。


Applicationクラスに静的として配置して、Application.isInDebugMode必要な場所に記述できるようにします。
ToniTornado 2018年

非常にエレガントで、これを私のアプリに実装しました。
vrachlin

56

これに対する簡単な解決策は次のとおりです。

import 'package:flutter/foundation.dart';

その後、あなたはのkReleaseModeように使用することができます

if(kReleaseMode){ // is Release Mode ??
    print('release mode');
} else {
    print('debug mode');
}

25

kDebugMode

これで、kDebugMode定数を使用できます。

if (kDebugMode) {
  // Code here will only be included in debug mode.
  // As kDebugMode is a constant, the tree shaker
  // will remove the code entirely from compiled code.
} else {

}

これはpreferrable終わった!kReleaseModeプロファイルモードのための、それもチェックなど、つまりはkDebugMode意味ないで、リリースモードいないで、プロファイルモード

kReleaseMode

プロファイルモードではなくリリースモードだけを確認したい場合は、kReleaseMode代わりに次を使用できます。

if (kReleaseMode) {
  // Code here will only be run in release mode.
  // As kReleaseMode is a constant, the tree shaker
  // will remove the code entirely from other builds.
} else {

}

kProfileMode

リリースモードではなくプロファイルモードだけを確認したい場合は、kProfileMode代わりに次を使用できます。

if (kProfileMode) {
  // Code here will only be run in release mode.
  // As kProfileMode is a constant, the tree shaker
  // will remove the code entirely from other builds.
} else {

}

20

うるさくはありませんが、基本パッケージにはkDebugMode定数が含まれています。そう :

import 'package:flutter/foundation.dart' as Foundation;

if(Foundation.kDebugMode) {
   print("App in debug mode");
}

3

これらは、アプリケーションがどのモードで実行されているかを確認するための2つのステップです。

  1. 取得するために次のインポートを追加します

    import 'package:flutter/foundation.dart' as Foundation;
    
  2. そしてkReleaseMode、アプリケーションが実行されているモードを確認します

    if(Foundation.kReleaseMode){ 
      print('app release mode');
    } else {
      print('App debug mode');
    }
    


0

Dartドキュメントからの抜粋:

アサーションはいつ正確に機能しますか?これは、使用しているツールとフレームワークによって異なります。

  • Flutterは、デバッグモードでアサーションを有効にします。
  • dartdevcなどの開発専用ツールは、通常、デフォルトでアサーションを有効にします。
  • dartやdart2jsなどの一部のツールは、コマンドラインフラグ--enable-assertsを介してアサーションをサポートします。

生産コード、アサーションは無視され、そしてアサートへの引数は評価されません。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.