flutter 애플리케이션이 디버그에서 실행 중인지 확인하는 방법은 무엇입니까?


101

짧은 질문이 있습니다. 앱이 디버그 모드 일 때 Flutter에서 코드를 실행하는 방법을 찾고 있습니다. Flutter에서 가능합니까? 문서 어디에서도 찾을 수없는 것 같습니다.

이 같은

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

Flutter 애플리케이션이 디버그 또는 릴리스 모드에서 실행 중인지 확인하는 방법은 무엇입니까?



1
나는 assert (() {print ( "Debug mode"); return true;}); 하지만 컴파일 할 수없는 오류가 발생합니다. 포스트 뒷부분에서 그들이 말하는 "프로필"은 나에게 별 의미가 없습니다. 사용 방법을 설명해 주시겠습니까?
Kevin Walter

답변:


33

이것이 작동하는 동안 상수 kReleaseMode또는 사용하는 kDebugMode것이 좋습니다. 전체 설명은 아래 의 Rémi의 답변을 참조하십시오 .


가장 쉬운 방법은 assert디버그 모드에서만 실행되므로 사용 하는 것입니다.

다음은 Flutter의 Navigator 소스 코드의 예입니다.

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가 넘어가는 부분이었습니다. 정말 고맙습니다!
Kevin Walter

5
작성할 때 () { .... }함수를 정의하지만 호출하지는 않습니다. ()실제로 추가하면 함수가 호출됩니다.
rmtmckenzie 2018 년

270

주장은 기술적으로 작동하지만 사용해서는 안됩니다.

대신 상수 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
Remi에 대해 설명 해주셔서 감사합니다. 저는 주장하는 대신 이것을 선택했습니다.
Fred

1
이것이 지금까지 어떻게 되었습니까? 이것은 받아 들여진 대답이어야합니다!
Empty2k12

5
또한 kDebugMode
Alexander Skvortsov

1
위젯에서도 트리 흔들림이 발생합니까? 그렇다면 visible : kDebugMode를 사용하여 Visibility 위젯을 만든 경우 해당 위젯이 릴리스 빌드 용 컴파일러에 의해 제거됩니까?
WiteCastle

57

이 작은 스 니펫은 필요한 작업을 수행해야합니다.

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

그렇지 않은 경우 main.dart부울을 설정할 수있는 디버그 모드에서 다른 것을 시작하도록 IDE를 구성 할 수 있습니다.


필요한 곳에 Application쓸 수 있도록 클래스에 정적으로 넣었 Application.isInDebugMode습니다.
ToniTornado

매우 우아하고 내 앱에서 구현했습니다.
vrachlin

56

이에 대한 간단한 해결책은 다음과 같습니다.

import 'package:flutter/foundation.dart';

그런 다음 다음 kReleaseMode과 같이 사용할 수 있습니다.

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

28

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 {

}

이것은보다 더 낫다 끝났 !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

다음은 애플리케이션이 실행되는 모드를 확인하는 두 단계입니다.

  1. 가져 오기를 위해 다음 가져 오기를 추가하십시오.

    import 'package:flutter/foundation.dart' as Foundation;
    
  2. 그리고 kReleaseMode응용 프로그램이 실행중인 모드를 확인하십시오.

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

2

이 작업을 수행하는 최신 방법은 다음과 같습니다.

const bool prod = const bool.fromEnvironment('dart.vm.product');

src


0

Dart 문서 에서 발췌 :

어설 션은 정확히 언제 작동합니까? 사용중인 도구와 프레임 워크에 따라 다릅니다.

  • Flutter는 디버그 모드 에서 어설 션을 활성화 합니다.
  • dartdevc와 같은 개발 전용 도구는 일반적으로 기본적으로 어설 션을 활성화합니다.
  • dart 및 dart2js와 같은 일부 도구는 명령 줄 플래그 --enable-asserts를 통해 어설 션을 지원합니다.

에서 생산 코드 주장은 무시됩니다 , 그리고 주장 인수는 평가되지 않습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.