Флаттер: json_serializable тип «_InternalLinkedHashMap» не является подтипом типа » Карта» ошибка

#flutter

#трепетать

Вопрос:

Я связываю облачную функцию с моей моделью Flutter. Результат приходит от Cloud-Function

 print(result.data);  print(result.data.runtimeType);  GameModel _incomingGame = GameModel.fromJson(result.data);  

печать(результат.данные);

 {  game: 'GTA',  played: ['ISODATE', ...] }  

печать(результат.данные.тип выполнения);

 flutter: _InternalLinkedHashMaplt;String, dynamicgt;  

Игровая модель

 @JsonSerializable() class GameModel {  String? game;  List? played;   GameModel(  this.game,  this.played,);   factory GameModel.fromJson(Maplt;String, dynamicgt; json) =gt;  _$GameModelFromJson(json);   Maplt;String, dynamicgt; toJson() =gt; _$GameModelToJson(this); }  

game_model.g.дротик

 // GENERATED CODE - DO NOT MODIFY BY HAND  part of 'game_model.dart';  // ************************************************************************** // JsonSerializableGenerator // **************************************************************************  GameModel _$GameModelFromJson(Maplt;String, dynamicgt; json) =gt; GameModel(  json['game'] as String?,  json['played'] as List?,  );  Maplt;String, dynamicgt; _$GameModelToJson(GameModel instance) =gt; lt;String, dynamicgt;{  'game': instance.game,  'played': instance.played,  };  

Тип времени выполнения результата входящих данных показывает, что он находится Maplt;String, dynamicgt; в консоли. Однако, когда я выполняю GameModel.fromJson() , это вызывает type '_InternalLinkedHashMaplt;Object?, Object?gt;' is not a subtype of type 'Maplt;String, dynamicgt;' in type cast .

Я действительно не понимаю, почему это как-то происходит? Даже если я сделаю что-то подобное ниже, это также приведет к ошибке приведения того же типа.

 GameModel _gameData = result.data; var game = GameModel.fromJson(_gameData);  

Есть ли какой-нибудь способ, которым я могу это исправить?

Комментарии:

1. вы тоже не против поделиться GameModel файлом класса?

2. вы можете попробовать jsonDecode , например GameModel.fromJson(jsonDecode(result.data));

3. jsonDecode(result.data) возвращает '_InternalLinkedHashMaplt;String, dynamicgt;' is not a subtype of type 'String' ошибку.

Ответ №1:

Попробуйте эти решения

 GameModel _incomingGame = GameModel.fromJson(result.data as Maplt;String, dynamicgt;);  

Или

 GameModel _incomingGame = GameModel.fromJson(Maplt;String, dynamicgt;.from(result.data));  

Также было бы лучше, если бы вы проверили типы перед выполнением приведения типов


Если вышеуказанные решения не работают, добавьте тип при вызове облачных функций

 final func = FirebaseFunctions.instance.httpsCallable('gameFunction'); final result = await funclt;Maplt;String, dynamicgt;?gt;();  

Комментарии:

1. Возникает та же проблема :/ Maplt;String, dynamicgt; game = Maplt;String, dynamicgt;.from(result.data); и print(game.runtimeType); возвращается Maplt;String, dynamicgt; , но как только он входит .fromJson() , он превращается в Maplt;Object?, Object?gt;

2. Не могли бы вы написать метод FromJSON вручную? или добавьте сгенерированный метод в вопрос @chichi

3. Да, это странно, я обновил ответ, если вы используете облачные функции firebase, возможно, это сработает, @chichi

4. Те же продукты. Я просто перестраиваюсь result.data и просто использую GameModel(); для добавления непосредственно в свою переменную. Если я это выясню, то буду держать тебя в курсе, в чем была проблема, братан. Большое спасибо за помощь

5. Был еще один object - map добавленный мангустом, который шел с data as Maplt;Object?, Object?gt; … Итак, я добавил объект в свой MongoDB, и все эти объекты имеют тип приведения как Maplt;Object?, Object?gt; .

Ответ №2:

Попробуйте это решение:

 GameModel.fromJson((result.data as Maplt;dynamic, dynamicgt;).castlt;String, dynamicgt;())