extension ListExt on List{ /// Remove all blank value and return the list. List getNoBlankList(){ List newList = []; for(var value in this){ if(value.toString() != ""){ newList.add(value); } } return newList; } T? firstWhereOrNull(bool Function(T element) test){ for(var element in this){ if(test(element)){ return element; } } return null; } void addIfNotNull(T? value){ if(value != null){ add(value); } } } extension StringExt on String{ ///Remove all value that would display blank on the screen. String get removeAllBlank => replaceAll("\n", "").replaceAll(" ", "").replaceAll("\t", ""); /// convert this to a one-element list. List toList() => [this]; String _nums(){ String res = ""; for(int i=0; i _nums(); String setValueAt(String value, int index){ return replaceRange(index, index+1, value); } String? subStringOrNull(int start, [int? end]){ if(start < 0 || (end != null && end > length)){ return null; } return substring(start, end); } String replaceLast(String from, String to) { if (isEmpty || from.isEmpty) { return this; } final lastIndex = lastIndexOf(from); if (lastIndex == -1) { return this; } final before = substring(0, lastIndex); final after = substring(lastIndex + from.length); return '$before$to$after'; } static bool hasMatch(String? value, String pattern) { return (value == null) ? false : RegExp(pattern).hasMatch(value); } bool _isURL(){ final regex = RegExp( r'^((http|https|ftp)://)?[\w-]+(\.[\w-]+)+([\w.,@?^=%&:/~+#-|]*[\w@?^=%&/~+#-])?$', caseSensitive: false); return regex.hasMatch(this); } bool get isURL => _isURL(); bool get isNum => double.tryParse(this) != null; } class ListOrNull{ static List? from(Iterable? i){ return i == null ? null : List.from(i); } }