json.decode fails to decode parame of JSON type after page reload in Flutter Web

  Kiến thức lập trình

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.

LEAVE A COMMENT