从 Firestore 获取数据并将其映射到提供程序对象

Posted

技术标签:

【中文标题】从 Firestore 获取数据并将其映射到提供程序对象【英文标题】:Fetching data from Firestore and map it into a provider object 【发布时间】:2019-12-12 06:42:56 【问题描述】:

我在将 Firestore 与 Flutter 中的 Provider(状态管理)结合使用时遇到问题。 我的问题主要是在我的班级上映射从 firestore 检索到的数据。 -> 将 Firebase 数据反序列化为 Dart 类

我能够从 Firestore 中检索数据并将其打印到控制台中。

如果我想使用 json.decode 我总是得到“type xx' is not a subtype of type 'Map'”,这里也提到了https://github.com/flutter/flutter/issues/17417

我的跑步课

import 'package:flutter/foundation.dart';
import 'package:cloud_firestore/cloud_firestore.dart';

enum Complexity  simple, challenging, hard 

class Run with ChangeNotifier 
  final String id;
  final String title;
  final List<String> workouts;
  final String imageUrl;
  final List<String> intervals;
  final List<String> steps;
  final int duration;
  Complexity complexity;
  final bool isRecovery;
  bool isBeginner;

  Run(
      @required this.id,
      @required this.title,
      @required this.workouts,
      @required this.imageUrl,
      @required this.intervals,
      @required this.steps,
      this.duration,
      this.complexity,
      this.isRecovery,
      this.isBeginner);

  factory Run.fromDocument(DocumentSnapshot doc) 
    return Run(
        id: doc.documentID,
        title: doc['title'] ?? '',
        workouts: doc['workouts'] ?? 0,
        imageUrl: doc['imageUrl'] ?? '',
        intervals: doc['intervals'] ?? 0,
        steps: doc['steps'] ?? 0);
  

我的 Runs 类应该获取数据

import 'package:flutter/material.dart';
import 'package:xxx/providers/run.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
import 'dart:convert';

final runsRef = Firestore.instance.collection('runs');

class Runs with ChangeNotifier 
  List<Run> _items = [];

  fetchRuns() async 
    DocumentSnapshot snapshot =
        await runsRef.getDocuments().then((QuerySnapshot snapshot) 
      snapshot.documents.forEach((DocumentSnapshot doc) 
        print(doc.data);
      );
    );
  
    我想调用函数 fetchRuns 来获取集合中的所有文档 我想将此检索到的数据映射到我的班级 我想使用这个类作为提供者来为不同的屏幕提供状态/数据

我卡在第 2 步,无法真正解决。

【问题讨论】:

你遇到了什么错误? 【参考方案1】:

我正在使用流,这就是我映射结果的方式。

  Stream<List<Run>> fetchRuns() 
    var snaps = Firestore.instance.collection('runs').snapshots();
    return snaps.map( (list) => 
          return list.documents.map((doc) => Run.fromDocument(doc)).toList()
       
     );
  

https://github.com/aaronksaunders/flutter_firebase_auth_app

lib/services/data.dart

【讨论】:

嘿亚伦,这看起来很不错,我一定会尝试的。唯一缺少的是我想使用pub.dev/packages/provider 来管理我的状态。我仍然会尝试您的解决方案并将提供程序包与它包装起来。非常感谢 @ChristianJosephs - 如果您查看该项目,我相信它正在使用提供者 谢谢,我想我监督了这一点。昨天发现了一个很棒的教程,尽管看看medium.com/flutter-community/…

以上是关于从 Firestore 获取数据并将其映射到提供程序对象的主要内容,如果未能解决你的问题,请参考以下文章

Angular Firestore 映射文档到对象

渲染从 Firebase Firestore 映射的 React 组件

Cloud Firestore:如何在我的集合查询中获取文档引用并将其映射为 JSON 值?

将 Firebase 身份验证用户映射到 Firestore 文档

如何从 Firebase Firestore 获取数据并将其存储在列表中以在颤振小部件中使用?

从 Firestore 数据库中获取最新数据到 Flutter App