Tcoat
Tcoat

Reputation: 35

Flutter Real Time Database Account' is not a subtype of type '(dynamic, dynamic) => MapEntry<dynamic, dynamic>' of 'transform'

I want to extract data from Firebase Realtime database and convert it to a model. But I am getting this error. I couldn't understand where I went wrong. How can I do it?

firebase_db_services.dart:

final databaseReference = FirebaseDatabase.instance.reference();
Future<List<Folder>> fetchFolders(String userID) async{
   var snapshot  =await  databaseReference.child("users").child(userID).child("folders").once();
   var result = await snapshot.value.values as Iterable;
   List<Folder> folderList = List();
   for(var item in result) {
     folderList.add(Folder.fromMap(item));
   }
   return folderList;
 }

folder_model.dart:

Folder.fromMap(Map<dynamic, dynamic> map) {
   this.folderName = map['folder_name'];
   this.folderColor = Color(map["folder_color"]);
   this.folderCreateDate = DateTime.parse(map['folder_create_date'].toString());
   this.accounts = List<Account>.from(map["accounts"].map((x) => Account.fromMap(x)));
 }

account_model.dart:

Account.fromMap(Map<dynamic, dynamic> map) {
   this.accountName = map['account_name'];
   this.accountEmail = map['account_mail'];
   this.accountPassword = map['account_password'].toString();
   this.accountCreateTime = DateTime.parse(map['account_createTime']);
   this.favorite = map["favorite"];
 }

incoming data:

{sosya_medya: {folder_create_date: 2020-12-04 19:08:46.066142, accounts: {account_password: account_password, account_mail: account_mail, account_name: account_name, account_createTime: 2020-12-04 19:08:46.066142, favorite: false}, folder_color: 4294198070, folder_name: sosyal_medya}}

Error:

E/flutter (32674): [ERROR:flutter/lib/ui/ui_dart_state.cc(177)] Unhandled Exception: type '(dynamic) => Account' is not a subtype of type '(dynamic, dynamic) => MapEntry<dynamic, dynamic>' of 'transform'
E/flutter (32674): #0      new Folder.fromMap (package:flutter_save_password/models/folder_model.dart:30:56)
E/flutter (32674): #1      FirestoreDBService.fetchFolders (package:flutter_save_password/services/storage/firebase_db_services.dart:56:29)
E/flutter (32674): <asynchronous suspension>
E/flutter (32674): #2      UserRepository.fetchFolders (package:flutter_save_password/services/repository/user_repository.dart:86:40)
E/flutter (32674): #3      PasswordSaveViewModel.fetchFolders (package:flutter_save_password/view_model/save_password_view_model.dart:59:37)
E/flutter (32674): #4      HomePage.build.<anonymous closure> (package:flutter_save_password/app/pages/home_page.dart:32:18)
E/flutter (32674): #5      Consumer.buildWithChild (package:provider/src/consumer.dart:175:19)
E/flutter (32674): #6      SingleChildStatelessWidget.build (package:nested/nested.dart:260:41)
E/flutter (32674): #7      StatelessElement.build (package:flutter/src/widgets/framework.dart:4701:28)
E/flutter (32674): #8      SingleChildStatelessElement.build (package:nested/nested.dart:280:18)
E/flutter (32674): #9      ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4627:15)
E/flutter (32674): #10     Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
E/flutter (32674): #11     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4606:5)
E/flutter (32674): #12     ComponentElement.mount (package:flutter/src/widgets/framework.dart:4601:5)
E/flutter (32674): #13     SingleChildWidgetElementMixin.mount (package:nested/nested.dart:223:11)
E/flutter (32674): #14     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3569:14)
E/flutter (32674): #15     Element.updateChild (package:flutter/src/widgets/framework.dart:3327:18)
E/flutter (32674): #16     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4652:16)
E/flutter (32674): #17     Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)
E/flutter (32674): #18     ComponentElement._firstBuild (package:flutter/src/widgets/framework.dart:4606:5)
E/flutter (32674): #19     ComponentElement.mount (package:flutter/src/widgets/framework.dart:4601:5)
E/flutter (32674): #20     Element.inflateWidget (package:flutter/src/widgets/framework.dart:3569:14)
E/flutter (32674): #21     Element.updateChild (package:flutter/src/widgets/framework.dart:3327:18)
E/flutter (32674): #22     ComponentElement.performRebuild (package:flutter/src/widgets/framework.dart:4652:16)
E/flutter (32674): #23     Element.rebuild (package:flutter/src/widgets/framework.dart:4343:5)

Edit:

I solved it this way:

if(map["accounts"]!= null){
     var mapList = List<Map<dynamic, dynamic>>.from(map["accounts"].values);
     for(var currentMap in mapList ){
       accounts.add(Account.fromMap(currentMap));
     }
   }

Upvotes: 2

Views: 89

Answers (1)

lordvidex
lordvidex

Reputation: 4098

First, I think the problem as read from the error here is that from this line:

this.accounts = List.from(map["accounts"].map((x) => Account.fromMap(x)));

map["accounts"] is a Map and not a List of Account, this is the reason for this error.

Map<dynamic,dynamic>.map((K,V)=>...)
List<dynamic>.map((x)=>...)

Note here that the map function on Map splits all the key-value pairs so from your code, accounts should be a List of maps where each map contains data for an Account.

Upvotes: 1

Related Questions