Dart numbers (the type num) are either integers (type int) or doubles (type double).
It is easy to check if a number is an int, just do value is int.
The slightly harder task is to check whether a double value has an integer value, or no fractional part. There is no simple function answering that, but you can do value == value.roundToDouble(). This removes any fractional part from the double value and compares it to the original value. If they are the same, then there was no fractional part.
So, a helper function could be:
bool isInteger(num value) =>
value is int || value == value.roundToDouble();
I use roundToDouble() instead of just round() because the latter would also convert the value to an integer, which may give a different value for large double values.
Another test for a double having an integer value could be value % 1.0 == 0.0, but it's not more readable, unlikely to be more efficient, and even though it does actually work, I had to check what % 1.0 does for double.infinity (it gives NaN) before I could trust it.