flutter_eval icon indicating copy to clipboard operation
flutter_eval copied to clipboard

Null pointer when try to convert a bridge class def to json.

Open Murmurl912 opened this issue 7 months ago • 0 comments

Full code at: https://github.com/Murmurl912/flutter_code_push_flutter_eval/blob/main/hot_update/test/generate_binding.dart Error is thrown in BridgeTypeRef.toJson, ref = null

class BridgeTypeRef {
  /// Reference a type by its spec (library URI and name)
  const BridgeTypeRef(this.spec, [this.typeArgs = const []])
      : cacheId = null,
        gft = null,
        ref = null;

  /// Reference a type by its local in-context name
  /// (e.g. a type parameter name such as T)
  const BridgeTypeRef.ref(this.ref, [this.typeArgs = const []])
      : cacheId = null,
        gft = null,
        spec = null;

  /// Internal use only.
  const BridgeTypeRef.type(this.cacheId, [this.typeArgs = const []])
      : ref = null,
        gft = null,
        spec = null;

  /// Reference a generic function type.
  /// Currently maps to [CoreTypes.function]
  const BridgeTypeRef.genericFunction(this.gft)
      : typeArgs = const [],
        ref = null,
        cacheId = null,
        spec = null;

  /// Load a type ref from its JSON representation.
  factory BridgeTypeRef.fromJson(Map<String, dynamic> json) {
    final id = json['id'];
    final ta = [
      for (final arg in json['typeArgs']) BridgeTypeRef.fromJson(arg)
    ];
    if (id != null) {
      return BridgeTypeRef.type(id, ta);
    }
    final gft = json['gft'];
    if (gft != null) {
      return BridgeTypeRef.genericFunction(gft);
    }
    final unresolved = json['unresolved'];
    if (unresolved != null) {
      return BridgeTypeRef(BridgeTypeSpec.fromJson(json['unresolved']), ta);
    }
    return BridgeTypeRef.ref(json['ref'], ta);
  }

  final int? cacheId;
  final String? ref;
  final BridgeFunctionDef? gft;
  final BridgeTypeSpec? spec;
  final List<BridgeTypeRef> typeArgs;

  /// Convert the type ref to its JSON representation.
  Map<String, dynamic> toJson() => {
        if (cacheId != null)
          'id': cacheId!
        else if (spec != null)
          'unresolved': spec!.toJson()
        else
          'ref': ref!, /// ref is null
        'typeArgs': [for (final t in typeArgs) t.toJson()]
      };
}

serialize failed: Null check operator used on a null value #0 BridgeTypeRef.toJson (package:dart_eval/src/eval/bridge/declaration/type.dart:134:21) #1 nestToJson (flutter_code_push_flutter_eval/hot_update/test/generate_binding.dart:33:27) #2 nestToJson (flutter_code_push_flutter_eval/hot_update/test/generate_binding.dart:27:7) #3 nestToJson (flutter_code_push_flutter_eval/hot_update/test/generate_binding.dart:34:7) #4 nestToJson (flutter_code_push_flutter_eval/hot_update/test/generate_binding.dart:27:7) #5 nestToJson (flutter_code_push_flutter_eval/hot_update/test/generate_binding.dart:34:7) #6 nestToJson (flutter_code_push_flutter_eval/hot_update/test/generate_binding.dart:19:7) #7 nestToJson (flutter_code_push_flutter_eval/hot_update/test/generate_binding.dart:27:7) #8 nestToJson (flutter_code_push_flutter_eval/hot_update/test/generate_binding.dart:34:7) #9 nestToJson (flutter_code_push_flutter_eval/hot_update/test/generate_binding.dart:27:7) #10 nestToJson (flutter_code_push_flutter_eval/hot_update/test/generate_binding.dart:34:7) #11 nestToJson (flutter_code_push_flutter_eval/hot_update/test/generate_binding.dart:27:7) #12 nestToJson (flutter_code_push_flutter_eval/hot_update/test/generate_binding.dart:27:7)

Murmurl912 avatar May 19 '25 11:05 Murmurl912