简体   繁体   中英

Dart check nullable Type

I looking to find a way to check if the type is nullable using switch statement but I got an error by doing that. Doesn't anyone know how to check if the type of object in the nullable state?

void dataFactory(Type type, data){
    switch(type){
      case A:
        return A.fromJson(data);
        case A?: // Getting error Conditions must have a static type of 'bool'
          return A.fromJson(data);
      case B:
        return B.fromJson(data);
    }
  }

You question is:

I looking to find a way to check if the type is nullable using switch statement. Doesn't anyone know how to check if the type of object in the nullable state?

Even though I didn't use the switch statement I guess you can use this answer and verify if a generic type is nullable by creating a new list instance.

Note: I'm assuming we can replace the Type type parameter instance with a generic type T . Since Flutter disable reflections this is the only way we can use in order to verify a given type T nature (Nullable or not).

bool isNullable<T>() => <T?>[] is List<T>;

You can also maybe adapt this function to fill your needs:

bool checkTypes<X, Y>() => <X>[] is List<Y> && <Y>[] is List<X>;

And use it as:

T dataFactory<T>(dynamic data) {
  if(checkTypes<T, A>()) {
    // Non-nullable [A]
  } else if(checkTypes<T, A?>()) {
    // Nullable [A]
  }

  /// Repeat with [B], [C], etc.
}

You can also test it:

void main() {
  print(checkTypes<A, A>()); // true
  print(checkTypes<B?, B>()); // false
  print(checkTypes<B?, B?>()); // true
}

You can create a function Type getType<T>() => T; , but since getType<A?>() would not be considered a constant value, you would not be able to use it with a switch statement:

Type getType<T>() => T;

dynamic dataFactory(Type type, dynamic data) {
  if (type == A || type == getType<A?>()) {
     return A.fromJson(data);
  } else if (type == B) {
     return B.fromJson(data);
  }
  ...
}

Another approach would be to use a Map of callbacks:

Type getType<T>() => T;

final _factoryMap = <Type, dynamic Function(dynamic)>{
  A: A.fromJson,
  getType<A?>(): A.fromJson,
  B: B.fromJson,
};

dynamic dataFactory(Type type, dynamic data) => _factoryMap[type]?.call(data);

Just use the null keyword here:

switch(type){
      case A:
        return A.fromJson(data);
        case null:
          return A.fromJson(data);
      case B:
        return B.fromJson(data);
    }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM