【问题标题】:Flutter Firebase upload a List of customClassFlutter Firebase 上传自定义类列表
【发布时间】: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;

标签: list firebase flutter


【解决方案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 的数据?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-28
  • 1970-01-01
  • 2013-06-01
  • 1970-01-01
  • 2018-10-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多