I just want to know what's the use of assert in a Dart. I was tried to figure it out by myself but I'm not able to do that. It would be great if someone explains to me the use of assert.
Flutter enables assertions in debug mode. Development-only tools such as dartdevc typically enable assertions by default. Some tools, such as dart run and dart2js support assertions through a command-line flag: --enable-asserts. In production code, assertions are ignored, and the arguments to assert aren't evaluated.
An assert statement disrupt normal execution if a boolean condition is false. If the boolean expression is true, then the code continues to execute normally. If assert statement results in false, then execution ends with an AssertionError.
Main purpose of assert
is testing conditions during debugging/development.
Let's think about a real example:
class Product {
Product({
required this.id,
required this.name,
required this.price,
this.size,
this.image,
this.weight,
}) : assert(id > 0),
assert(name.isNotEmpty),
assert(price > 0.0);
final int id;
final String name;
final double price;
final String? size;
final String? image;
final int? weight;
}
We have a Product
class and fields like id
, name
and price
are mandatory but other fields can be handled by generic values as you guess. By asserting required fields, you'll test this data class during debugging/development. Keep in the mind, all asserts ignored in release/production mode;
From the dart.dev#assert:
In production code, assertions are ignored, and the arguments to assert aren’t evaluated.
Comparing to writing tests, even though they are not the same thing, asserts can be very handy with minimal effort, so be generous for writing asserts especially if you don't write tests, it usually rewards you.
Additionally, since constants like kDebugMode
, kReleaseMode
are part of package:flutter/foundation.dart
, another use case is debugMode
specific codes in Non-Flutter
applications. Let's have a look this code:
bool get isDebugMode {
bool value = false;
assert(() {
value = true;
//you can execute debug-specific codes here
return true;
}());
return value;
}
At first it may look confusing but it's a tricky but simple code. An anonymous closure always returns true, so we don't throw any error in any case. Since compiler eliminates the assert statements in release mode, that closure only run in debug mode and mutate the value
variable.
Similarly, you can throw in only debug, from Flutter
source code:
void addAll(Iterable<E> iterable) {
int i = this.length;
for (E element in iterable) {
assert(this.length == i || (throw ConcurrentModificationError(this)));
add(element);
i++;
}
}
That means, it throws only in debug mode, intended for usage in testing your logic.
For the versions of Dart before 2.12
, your typical example should be look like this:
import 'package:meta/meta.dart';
class Product {
final int id;
final String name;
final int price;
final String size;
final String image;
final int weight;
const Product({
@required this.id,
@required this.name,
@required this.price,
this.size,
this.image,
this.weight,
}) : assert(id != null && name != null && price != null);
}
From here:
During development, use an assert statement — assert(condition, optionalMessage); — to disrupt normal execution if a boolean condition is false.
Suppose you want to open a URL that must begin with "https"
. How will you confirm this? Here's an example.
Example:
void openUrl({String url}) {
assert(url.startsWith('https'), 'The url should start with https');
// We can proceed as we 'https' in the url.
}
An assert is similar to an Error in that it is for reporting bad states that should never happen. The difference is that asserts are only checked in debug mode. They are completely ignored in production mode.
Ex:
OverlayEntry({
@required this.builder,
bool opaque = false,
bool maintainState = false,
}) : assert(builder != null),
assert(opaque != null),
assert(maintainState != null),
_opaque = opaque,
_maintainState = maintainState;
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With