@@ -28,6 +28,7 @@ extension StringExtensions on String {
2828 }
2929 } else if (R == List ) {
3030 try {
31+ if (! value.startsWith ('[' ) || ! value.endsWith (']' )) return null ;
3132 return value
3233 .substring (1 , value.length - 1 )
3334 .split (',' )
@@ -59,3 +60,46 @@ extension StringExtensions on String {
5960 });
6061 }
6162}
63+
64+ /// Declares extensions on [Object] .
65+ extension ObjectExt on Object ? {
66+ /// Converts given string to a typed value if possible.
67+ /// Returns [defaultValue] or null otherwise.
68+ R ? typedValue <R >({R ? defaultValue}) {
69+ final value = this ;
70+ if (value is R ) return value;
71+
72+ if (R == String ) {
73+ return value as R ;
74+ } else if (R == int ) {
75+ return (int .tryParse ('$value ' ) ?? defaultValue) as R ? ;
76+ } else if (R == double ) {
77+ return (double .tryParse ('$value ' ) ?? defaultValue) as R ;
78+ } else if (R == num ) {
79+ return (num .tryParse ('$value ' ) ?? defaultValue) as R ;
80+ } else if (R == bool ) {
81+ final boolValue = bool .tryParse ('$value ' , caseSensitive: false );
82+ if (boolValue == null ) return defaultValue;
83+ return (boolValue || value == '1' ) as R ;
84+ } else if (R == Map ) {
85+ try {
86+ return jsonDecode ('$value ' ) as R ? ;
87+ } catch (e) {
88+ return defaultValue;
89+ }
90+ } else if (R == List ) {
91+ try {
92+ if (! '$value ' .startsWith ('[' ) || ! '$value ' .endsWith (']' )) return null ;
93+ return '$value '
94+ .substring (1 , '$value ' .length - 1 )
95+ .split (',' )
96+ .map ((e) => e.trim ().parsedValue ())
97+ .toList () as R ? ;
98+ } catch (e) {
99+ return defaultValue;
100+ }
101+ } else {
102+ return value as R ? ;
103+ }
104+ }
105+ }
0 commit comments