I pass a parameter of type JSON to another page in queryparams. It looks like this:
getPartnerResult={"technicianId":{"_firestore":{"projectId":"pandahub-472fa"},"_path":{"segments":["technicians","V9jFyiTKGUEW0qf9VfhN"]},"_converter":{}},"firstName":"Manmohit","lastName":"Singh","photoUrl":"https://firebasestorage.googleapis.com/v0/b/pandahub-472fa.appspot.com/o/users/ZNCDfoyRARN7foCVCswd7s59jqZ2/uploads/1709328934514962.jpg?alt=media&token=566cf358-bae7-4c97-acfb-6e77f16d5a7c","rating":4.9,"totalServicesProvided":2031,"bio":"test","isCertified":true,"yearsOfExperience":5,"isRecommended":false,"languages":["English"],"workPhotos":["https://shop.wwf.ca/cdn/shop/files/giant-panda-WW230176.jpg?v=1694540662&width=1024"],"acceptanceRate":97}
For some reason, after I reload the page it gives a null error: Error deserializing parameter: FormatException: SyntaxError: Unterminated string in JSON at position 335 (line 1 column 336)
Somehow it is decoding our url twice(?) so that after pafe reload url is already decoded and it tries to it again.
builder: (context, params) => ProDetailsWidget(
getPartnerResult:
params.getParam('getPartnerResult', ParamType.JSON),
isFromReschedule:
params.getParam('isFromReschedule', ParamType.bool),
documentToReschedule:
params.getParam('documentToReschedule', ParamType.bool),
),
dynamic getParam<T>(
String paramName,
ParamType type, [
bool isList = false,
List<String>? collectionNamePath,
]) {
if (futureParamValues.containsKey(paramName)) {
return futureParamValues[paramName];
}
if (!state.allParams.containsKey(paramName)) {
return null;
}
final param = state.allParams[paramName];
// Got parameter from `extras`, so just directly return it.
if (param is! String) {
return param;
}
// Return serialized value.
return deserializeParam<T>(param, type, isList,
collectionNamePath: collectionNamePath);
}
dynamic deserializeParam<T>(
String? param,
ParamType paramType,
bool isList, {
List<String>? collectionNamePath,
StructBuilder<T>? structBuilder,
}) {
try {
if (param == null) {
return null;
}
if (isList) {
final paramValues = json.decode(param);
if (paramValues is! Iterable || paramValues.isEmpty) {
return null;
}
return paramValues
.whereType<String>()
.map((p) => p)
.map((p) => deserializeParam<T>(
p,
paramType,
false,
collectionNamePath: collectionNamePath,
structBuilder: structBuilder,
))
.where((p) => p != null)
.map((p) => p! as T)
.toList();
}
switch (paramType) {
case ParamType.int:
return int.tryParse(param);
case ParamType.double:
return double.tryParse(param);
case ParamType.String:
return param;
case ParamType.bool:
return param == 'true';
case ParamType.DateTime:
final milliseconds = int.tryParse(param);
return milliseconds != null
? DateTime.fromMillisecondsSinceEpoch(milliseconds)
: null;
case ParamType.DateTimeRange:
return dateTimeRangeFromString(param);
case ParamType.LatLng:
return latLngFromString(param);
case ParamType.Color:
return fromCssColor(param);
case ParamType.FFPlace:
return placeFromString(param);
case ParamType.FFUploadedFile:
return uploadedFileFromString(param);
case ParamType.JSON:
return json.decode(param);
case ParamType.DocumentReference:
return _deserializeDocumentReference(param, collectionNamePath ?? []);
case ParamType.DataStruct:
final data = json.decode(param) as Map<String, dynamic>? ?? {};
return structBuilder != null ? structBuilder(data) : null;
case ParamType.Enum:
return deserializeEnum<T>(param);
default:
return null;
}
} catch (e) {
if (kDebugMode) {
print('Error deserializing parameter: $e');
}
return null;
}
}
I am expecting our url to be encoded in the url bar.