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&lt;String, dynamic&gt; 【参考方案1】:

您可以使用 dart: convert 将模型对象转换为 json 格式,即您可以上传到 Firebase 的 Map

为此,我已将您的 toMap 方法重命名为 toJsonfromMap 方法重命名为 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 存储共享首选项中的自定义类列表

Flutter Firebase 上传多张图片

Flutter - 如何在应用邀请功能的 Firebase 动态链接中传递自定义参数?

使用 Flutter firebase 自定义用户名和密码登录

在电子邮件密码身份验证中进行额外的自定义检查 (Flutter - Firebase)