Làm thế nào để kiểm tra ứng dụng chập chờn đang chạy trong gỡ lỗi?


96

Tôi có một câu hỏi ngắn. Tôi đang tìm cách thực thi mã trong Flutter khi ứng dụng ở chế độ Gỡ lỗi. Điều đó có thể xảy ra trong Flutter không? Tôi dường như không thể tìm thấy nó ở bất cứ đâu trong tài liệu.

Một cái gì đó như thế này

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

Làm thế nào để kiểm tra xem ứng dụng rung đang chạy ở chế độ gỡ lỗi hoặc phát hành?



1
Tôi đã thử khẳng định (() {print ("Chế độ gỡ lỗi"); return true;}); nhưng điều đó chỉ mang lại cho tôi một lỗi không thể biên dịch. "Hồ sơ" mà họ đang nói về sau trong bài đăng không có nhiều ý nghĩa đối với tôi. Bạn có thể vui lòng giải thích làm thế nào để sử dụng nó?
Kevin Walter

Câu trả lời:


28

Trong khi điều này hoạt động, sử dụng hằng số kReleaseModehoặc kDebugModethích hợp hơn. Xem câu trả lời của Rémi dưới đây để có lời giải thích đầy đủ, đây có lẽ nên là câu hỏi được chấp nhận.


Cách dễ nhất là sử dụng assertvì nó chỉ chạy ở chế độ gỡ lỗi.

Đây là một ví dụ từ mã nguồn của Flutter's 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;
}());

Đặc biệt lưu ý rằng ()ở cuối lệnh gọi - khẳng định chỉ có thể hoạt động trên boolean, vì vậy chỉ cần chuyển vào một hàm sẽ không hoạt động.


1
"Lưu ý cụ thể" là phần mà IDE của tôi đã vấp phải. Cảm ơn bạn rất nhiều!
Kevin Walter

5
Khi bạn viết, () { .... }bạn đang xác định hàm, nhưng không gọi nó. Thêm ()thực sự gọi hàm.
rmtmckenzie

258

Mặc dù khẳng định hoạt động về mặt kỹ thuật, nhưng bạn không nên sử dụng chúng.

Thay vào đó, hãy sử dụng hằng số kReleaseModetừpackage:flutter/foundation.dart


Sự khác biệt là tất cả về cây rung

Rung cây (hay còn gọi là trình biên dịch loại bỏ mã không sử dụng) phụ thuộc vào các biến là hằng số.

Vấn đề là, với các khẳng định isInReleaseModeboolean của chúng ta không phải là một hằng số. Vì vậy, khi vận chuyển ứng dụng của chúng tôi, cả mã phát hành và nhà phát triển đều được bao gồm.

Mặt khác, kReleaseMode một hằng số. Do đó, trình biên dịch có thể xóa mã không sử dụng một cách chính xác và chúng ta có thể thực hiện một cách an toàn:

if (kReleaseMode) {

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

27
Cũng chỉ là một lưu ý nhỏ, để tránh ô nhiễm lớp học của bạn với những ẩn số nhập như sau import 'package:flutter/foundation.dart' as Foundation;thì bạn có thể làmFoundation. kReleaseMode
Oliver Dixon

3
Cảm ơn vì đã giải thích cho Remi - tôi đã chọn điều này thay vì khẳng định - công cụ tốt!
Fred

1
Làm thế nào là điều này cho đến nay, đây phải là câu trả lời được chấp nhận!
Empty2k12

5
Ngoài ra còn có kDebugMode
Alexander Skvortsov

1
Rung cây cũng sẽ xảy ra với các vật dụng? Vì vậy, nếu tôi đã tạo một widget Visibility với hiển thị: kDebugMode, liệu widget đó có bị trình biên dịch loại bỏ cho các bản phát hành không?
WiteCastle

56

đoạn mã nhỏ này sẽ làm những gì bạn cần

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

nếu không, bạn có thể định cấu hình IDE của mình để khởi chạy một IDE khác main.darttrong chế độ gỡ lỗi, nơi bạn có thể đặt boolean.


Tôi đặt nó dưới dạng tĩnh trong một Applicationlớp để tôi có thể viết Application.isInDebugModeở nơi tôi cần.
ToniTornado

Rất thanh lịch, đã triển khai điều này trong ứng dụng của tôi.
vrachlin 14/02/19

53

Đây là một giải pháp đơn giản cho điều này:

import 'package:flutter/foundation.dart';

sau đó bạn có thể sử dụng kReleaseModenhư

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

21

kDebugMode

Bây giờ bạn có thể sử dụng kDebugModehằng số .

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 {

}

Điều này thích hợp hơn !kReleaseModevì nó cũng kiểm tra chế độ cấu hình, nghĩa kDebugModekhông ở chế độ phát hành không ở chế độ cấu hình .

kReleaseMode

Nếu bạn chỉ muốn kiểm tra chế độ phát hành chứ không phải chế độ cấu hình, bạn có thể sử dụng kReleaseModethay thế:

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

Nếu bạn chỉ muốn kiểm tra chế độ cấu hình chứ không phải chế độ phát hành, bạn có thể sử dụng kProfileModethay thế:

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

Không cầu kỳ nhưng gói kem nền bao gồm một kDebugModehằng số; Vì thế :

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

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

3

Đây là hai bước để biết ứng dụng chạy ở chế độ nào

  1. Thêm các lần nhập sau để nhận

    import 'package:flutter/foundation.dart' as Foundation;
    
  2. kReleaseModekiểm tra xem ứng dụng đang chạy ở chế độ nào

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

1

Tôi tin rằng cách mới nhất để làm điều này là:

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

src


0

Trích từ Tài liệu Dart :

Khi nào chính xác thì các xác nhận hoạt động? Điều đó phụ thuộc vào các công cụ và khuôn khổ bạn đang sử dụng:

  • Flutter cho phép xác nhận trong chế độ gỡ lỗi .
  • Các công cụ chỉ dành cho phát triển như dartdevc thường cho phép xác nhận theo mặc định.
  • Một số công cụ, chẳng hạn như dart và dart2js, hỗ trợ xác nhận thông qua cờ dòng lệnh: --enable-khẳng định.

Trong mã sản xuất , các xác nhận bị bỏ qua và các đối số để khẳng định không được đánh giá.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.