Как использовать тип `Карта` в Pigeon

#flutter #pigeon

#flutter #pigeon

Вопрос:

Как я могу указать тип в Pigeon как карту (например Map<String, String> ), и предпочтительно карту с динамическими типами значений ( Map<String, dynamic> . Я не могу точно знать, к какому типу data относятся значения, пока не будет отправлено push-сообщение.

Попытка 1

Я попытался определить класс с помощью:

 class RemoteMessage {
  Notification? notification;
  Map<String, dynamic>? data;
}
 

К сожалению, я получаю сообщение об ошибке:

 Error: pigeons/push.dart:6: Generic type arguments must be nullable in field "data" in class "RemoteMessage".
Error: pigeons/push.dart:6: Generic type arguments must be nullable in field "data" in class "RemoteMessage".
 

Попытка 2

Я также попытался сделать dynamic необязательным:

 class RemoteMessage {
  Notification? notification;
  Map<String, dynamic?>? data;
}
 

В этом случае я получаю только 1 экземпляр ошибки:

 Error: pigeons/push.dart:6: Generic type arguments must be nullable in field "data" in class "RemoteMessage".
 

Попытка 3

Если я сделаю тип ключа необязательным, т.Е. Map<String?, dynamic>? data; Я получу сообщение об ошибке:

 Unhandled exception:
FileSystemException: Cannot open file, path = './android/app/src/main/java/dev/flutter/pigeon/Pigeon.java' (OS Error: No such file or directory, errno = 2)
#0      _File.open.<anonymous closure> (dart:io/file_impl.dart:356:9)
<asynchronous suspension>
pub finished with exit code 255
 

Краткие сведения

Похоже, что Pigeon не поддерживает Map or dynamic , хотя он уже должен поддерживать дженерики: https://github.com/flutter/flutter/issues/63468 .

Ответ №1:

После нескольких проблем с Flutter (1 и 2), где Стюарт Морган (разработчик из Google, вероятно, работающий над Dart / Pigeon) оказал мне некоторую помощь, я понял, что мой класс должен выглядеть так:

 class RemoteMessage {
  Notification? notification;
  Map<String?, Object?>? data;
}
 

Ключевые выводы:

  • Я должен использовать Object вместо dynamic , потому что в противном случае Pigeon генерирует неработающий код на Java, Objective-C и Dart. Это ошибка, о которой я сообщил в Pigeon: использование динамического генерирующего кода …:
    • Dart: dynamic.decode()
    • Objective-C: @property(nonatomic, strong, nullable) NSDictionary<NSString *, dynamic *> * data;
    • Java: public void setData(Map<String, dynamic> setterArg) { this.data = setterArg; }
  • и поскольку, как задокументировано, Pigeon в настоящее время не поддерживает ненулевые типы, я должен использовать ? для всех типов, включая использование String? в качестве типа для ключа карты вместо String : Map<String?, Object?> .