Flutter Firebase 上传自定义类列表
Posted
技术标签:
【中文标题】Flutter Firebase 上传自定义类列表【英文标题】:Flutter Firebase upload a List of customClass 【发布时间】:2021-03-08 16:07:31 【问题描述】:我想将自定义类的列表上传到云 Firebase,但我收到错误消息,即我的自定义类不是 <dynamic>
类型的子类型。发生这种情况是因为无法将自定义类列表上传到 Firebase?我是否需要创建一个新的集合来作为列表工作,还是有其他方法可以解决这个问题?
import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/material.dart';
//Class for the custom list
class CustomClass
int id;
String content;
CustomClass(this.id, this.content);
CustomClass.fromMap(Map<String, dynamic> data)
id = data['id'];
content = data['content'];
Map<String, dynamic> toMap()
return
'id': id,
'content': content,
;
//Model which I want to upload with the custom list
class CustomModel
String name;
List<CustomClass> customList;
CustomModel();
CustomModel.fromMap(Map<String, dynamic> data)
name = data['name'];
customList = data['customList'];
Map<String, dynamic> toMap()
return
'name': name,
'customList': customList,
;
//Page to upload the customModel with the customList
class UploadPage extends StatelessWidget
CustomModel _customModel = CustomModel();
List<CustomClass> _customList = [CustomClass(id: 1, content: 'UserContent')];
@override
Widget build(BuildContext context)
return Scaffold(
body: FlatButton(
child: Text('Upload'),
onPressed: () async
_customModel.name = 'UserName';
_customModel.customList = _customList;
await Firestore.instance
.collection('CustomClass')
.add(_customModel.toMap());
),
);
【问题讨论】:
您可以将任何类型的自定义类上传到 Firebase。您只需将其转换为json
格式或Map<String, dynamic>
。
【参考方案1】:
您可以使用 dart: convert
将模型对象转换为 json 格式,即您可以上传到 Firebase 的 Map
。
为此,我已将您的 toMap
方法重命名为 toJson
和 fromMap
方法重命名为 fromJson
。另外,我在fromJson
方法之前添加了factory
关键字。
您还应该重写 toString
方法来打印您的对象以进行测试/调试。
您的代码应如下所示:
//Class for the custom list
class CustomClass
int id;
String content;
CustomClass(this.id, this.content);
factory CustomClass.fromJson(Map<String, dynamic> data)
return CustomClass(
id: data['id'],
content: data['content'],
);
Map<String, dynamic> toJson()
return
'id': id,
'content': content,
;
@override
String toString()
return '$const JsonEncoder.withIndent(' ').convert(this)';
//Model wich I want to upload with the custom list
class CustomModel
String name;
List<CustomClass> customList;
CustomModel(
this.name,
this.customList,
);
factory CustomModel.fromJson(Map<String, dynamic> data)
List<dynamic> list = data['customList'] ?? [];
final customList = list.map((e) => CustomClass.fromJson(e)).toList();
return CustomModel(
name: data['name'],
customList: customList,
);
Map<String, dynamic> toJson()
return
'name': name,
'customList': customList?.map((e) => e.toJson())?.toList(),
;
@override
String toString()
return '$const JsonEncoder.withIndent(' ').convert(this)';
// Your build method:
CustomModel _customModel = CustomModel();
List<CustomClass> _customList = [CustomClass(id: 1, content: 'UserContent')];
@override
Widget build(BuilContext context)
return Scaffold(
body: FlatButton(
child: Text('Upload'),
onPressed: () async
_customModel.name = 'UserName';
_customModel.customList = _customList;
await Firestore.instance
.collection('CustomClass')
.add(_customModel.toJson());
),
);
【讨论】:
我得到错误:无效的参数:'CustomClass'的实例)。在模型上传的那一行 我已经更新了答案。请检查CustomModel
类中的toJson
方法。现在,您将不会收到该错误。
@RaviSinghLodhi 我现在如何在 ListView.builder 中获取和解析来自 Firebase 的数据?以上是关于Flutter Firebase 上传自定义类列表的主要内容,如果未能解决你的问题,请参考以下文章
是否有其他方法可以在提供程序 Flutter 中更新自定义列表视图中的数据
Flutter - 如何在应用邀请功能的 Firebase 动态链接中传递自定义参数?