#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; }
- Dart:
- и поскольку, как задокументировано, Pigeon в настоящее время не поддерживает ненулевые типы, я должен использовать
?
для всех типов, включая использованиеString?
в качестве типа для ключа карты вместоString
:Map<String?, Object?>
.