繁体   English   中英

如何从 Firestore 解析嵌套对象?

[英]How to parse nested objects from Firestore?

我想将这个 object 解析为 Dart object 但是当它嵌套时我会遇到问题。 它在没有任何嵌套的自定义对象时有效,但当我尝试解析嵌套的 object 时出现错误。

这是 Firestore 上的 model Firestore 数据

这些是我的模型的代码

class Testt {

final String name;
  final List<Prefs> prefs;

  const Testt({this.name, this.prefs});

  Map<String, dynamic> toMap() {
    return {
      'name': name,
      'prefs': prefs
    };
  }

  factory Testt.fromJSON(Map<String, dynamic> json) {
    return Testt(
        name: json['name'],
        prefs: (json['prefs'] as List).map((e) => Prefs.fromJSON(e)).toList()
    );
  }
}

class Prefs {
  final String first;
  final String second;

  const Prefs({this.first, this.second});

  Map<String, dynamic> toMap() {
    return {
      'first': first,
      'second': second
    };
  }

  factory Prefs.fromJSON(Map<String, dynamic> json) {
    print(json);
    return Prefs(
        first: json['first'],
        second: json['second']
    );
  }
}

这是我用来从 Firestore 获取数据的方法

Stream<List<Testt>> getTestt() {
    return _db.collection('test').snapshots().map((snapshot) => snapshot.documents.map((document) => Testt.fromJSON(document.data)).toList());
  }

我真的需要你的帮助,找不到任何可行的解决方案。 提前致谢

试试这个,它可能对你有用

import 'dart:convert';

class Testt {
  final String name;
  final List<Prefs> prefs;
  Testt({
    this.name,
    this.prefs,
  });

  Testt copyWith({
    String name,
    List<Prefs> prefs,
  }) {
    return Testt(
      name: name ?? this.name,
      prefs: prefs ?? this.prefs,
    );
  }

  Map<String, dynamic> toMap() {
    return {
      'name': name,
      'prefs': prefs?.map((x) => x?.toMap())?.toList(),
    };
  }

  factory Testt.fromMap(Map<String, dynamic> map) {
    if (map == null) return null;
  
    return Testt(
      name: map['name'],
      prefs: List<Prefs>.from(map['prefs']?.map((x) => Prefs.fromMap(x))),
    );
  }

  String toJson() => json.encode(toMap());
  factory Testt.fromJson(String source) => Testt.fromMap(json.decode(source));

  @override
  String toString() => 'Testt(name: $name, prefs: $prefs)';
}

class Prefs {
  final String first;
  final String second;
  Prefs({
    this.first,
    this.second,
  });

  Prefs copyWith({
    String first,
    String second,
  }) {
    return Prefs(
      first: first ?? this.first,
      second: second ?? this.second,
    );
  }

  Map<String, dynamic> toMap() {
    return {
      'first': first,
      'second': second,
    };
  }

  factory Prefs.fromMap(Map<String, dynamic> map) {
    if (map == null) return null;
  
    return Prefs(
      first: map['first'],
      second: map['second'],
    );
  }

  String toJson() => json.encode(toMap());

  factory Prefs.fromJson(String source) => Prefs.fromMap(json.decode(source));

  @override
  String toString() => 'Prefs(first: $first, second: $second)';
}
class TestMapping extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    Stream<List<Testt>> getTestt() {
      return FirebaseFirestore.instance.collection("Test").snapshots().map(
          (snapshot) => snapshot.docs
              .map((document) => Testt.fromMap(document.data()))
              .toList());
    }

    return Scaffold(
      body: StreamBuilder(
        stream: getTestt(),
        builder: (BuildContext context, AsyncSnapshot<List<Testt>> snaphot) {
          print(snaphot.data);
          if (snaphot.hasData) {
            return Center(
              child: Column(
                  children: snaphot.data.map((e) {
                return Column(
                  children: [
                    Text("Name: " + e.name),
                    for (var _prefs in e.prefs)
                      Column(
                        children: [
                          Text("First: " + _prefs.first),
                          Text("Second: " + _prefs.second)
                        ],
                      ),
                  ],
                );
              }).toList()),
            );
          } else {
            return Center(
              child: CircularProgressIndicator(),
            );
          }
        },
      ),
    );
  }
}

得到这个数据

[Testt(name: burak, prefs: [Prefs(first: asd, second: dsa), Prefs(first: abc, second: cba)])]

在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM