【问题标题】:Flutter Real Time Database Account' is not a subtype of type '(dynamic, dynamic) => MapEntry<dynamic, dynamic>' of 'transform'Flutter Real Time Database Account' 不是 'transform' 类型 '(dynamic, dynamic) => MapEntry<dynamic, dynamic>' 的子类型
【发布时间】:2021-03-16 22:10:46
【问题描述】:

我想从 Firebase 实时数据库中提取数据并将其转换为模型。但我收到了这个错误。我不明白我哪里出错了。我该怎么做?

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;
 }

文件夹模型.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"];
 }

传入数据:

{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}}

错误:

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)

编辑:

我是这样解决的:

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

【问题讨论】:

    标签: flutter firebase-realtime-database


    【解决方案1】:

    首先,我认为从这里的错误中读取的问题是从这一行开始的:

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

    map["accounts"] 是一个地图而不是一个帐户列表,这就是这个错误的原因。

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

    请注意,Map 上的 map 函数会拆分所有键值对,因此从您的代码中,accounts 应该是一个 List 地图,其中每个地图都包含一个帐户的数据。

    【讨论】:

    • 你是对的。我按照你说的做了,问题就解决了。非常感谢!
    猜你喜欢
    • 2022-11-13
    • 2021-04-30
    • 2021-01-22
    • 1970-01-01
    • 2021-12-02
    • 2021-09-08
    • 1970-01-01
    • 2021-08-05
    • 2020-05-19
    相关资源
    最近更新 更多