草庐IT

firebase - 从 Firestore 到 Flutter 的 Stream Builder

coder 2023-05-09 原文

我想知道如何使用 streambuilder 将数据从 firestore 获取到 Flutter 应用程序。我创建了必要的样板代码我已经构建并运行了小部件,并且在下面的代码中 headimageassetpath 只是存在于 firestore 中的 URL 字符串。

 @override
  Widget build(BuildContext context) {
    return Scaffold(
      body:
      new StreamBuilder(
        stream: Firestore.instance.collection('Items').snapshots(),
        builder: (_, AsyncSnapshot<QuerySnapshot> snapshot) {
          var items = snapshot.data?.documents ?? [];
          return new Lost_Card(
            headImageAssetPath : snapshot.data.documents.map()(['url'],)   

          );
        },
      )

我的火库:

完整代码:

import 'package:flutter/material.dart';
import 'package:cloud_firestore/cloud_firestore.dart';
class LostPage extends StatefulWidget {
  @override
  _LostPage createState() => new _LostPage();
}

class _LostPage extends State<LostPage> {

  //temp vars
  final String firebasetest = "Test";

  //firestore vars
  final DocumentReference documentReference =
      Firestore.instance.document("Items/Rusty");


  //CRUD operations
  void _add() {
    Map<String, String> data = <String, String>{
      "name": firebasetest,
      "desc": "Flutter Developer"
    };
    documentReference.setData(data).whenComplete(() {
      print("Document Added");
    }).catchError((e) => print(e));
  }


  @override
  Widget build(BuildContext context) {
    return Scaffold(
      body:
      new StreamBuilder(
        stream: Firestore.instance.collection('Items').snapshots(),
        builder: (_, AsyncSnapshot<QuerySnapshot> snapshot) {
          var items = snapshot.data?.documents ?? [];


          return new Lost_Card(
            headImageAssetPath : snapshot.data.documents.map()(['url'],)


          );
        },
      )

      /*new Lost_Card(
        headImageAssetPath: "https://i.imgur.com/FtaGNck.jpg" ,
        title: "Mega Dish",
        noro: "old",


      )*/,
      floatingActionButton: new FloatingActionButton(
          child: new Icon(Icons.add),
          onPressed: _add),
    );
  }
}

class Lost_Card extends StatelessWidget
{

  //All the card variables
  final String headImageAssetPath;
  final IconData icon;
  final Color iconBackgroundColor;
  final String title;
  final String noro;
  final int price;
  final ShapeBorder shape;

  Lost_Card({

    this.headImageAssetPath,  //used
    this.icon,
    this.iconBackgroundColor,
    this.title, //used
    this.noro,  //used
    this.price,

  });



  @override
  Widget build(BuildContext context) {





    // TODO: implement build
   return GridView.count(
      shrinkWrap: true,
      crossAxisCount: 2,
      children: <Widget>[
        Card(
          child: Column(
            // mainAxisSize: MainAxisSize.max,
            mainAxisAlignment: MainAxisAlignment.center,
            children: <Widget>[
              Expanded(
                child: Stack(
                  fit: StackFit.expand,
                  children: <Widget>[
                    Container(
                      height: MediaQuery.of(context).size.height / 4,
                      width: MediaQuery.of(context).size.height / 2.5,

                      child: DecoratedBox(
                        decoration: BoxDecoration(
                          image: DecorationImage(
                              image: NetworkImage(
                                  headImageAssetPath),
                              fit: BoxFit.cover),
                        ),
                      ),
                    ),
                    Padding(
                      padding: const EdgeInsets.all(8.0),
                      child: Align(
                        alignment: FractionalOffset.topLeft,
                        child: CircleAvatar(
                          backgroundColor: Colors.redAccent,
                          radius: 15.0,
                          child: Text(
                            noro,
                            textScaleFactor: 0.5,
                          ),
                        ),
                      ),
                    ),
                    Align(
                      alignment: FractionalOffset.topRight,
                      child: Container(
                        color: Colors.blueAccent,
                        height: 35.0,
                        width: 35.0,
                        child: Center(
                          child: Column(
                            mainAxisAlignment: MainAxisAlignment.center,
                            children: <Widget>[
                              Icon(Icons.account_circle),
                              Text(
                                "1P",
                                textScaleFactor: 0.5,
                              ),
                            ],
                          ),
                        ),
                      ),
                    ),
                  ],
                ),
              ),
              Center(
                child: Container(
                  padding: const EdgeInsets.all(8.0),
                  alignment: FractionalOffset.bottomCenter,
                  child: Text(
                    title,
                    style: TextStyle(
                      fontWeight: FontWeight.w700,
                    ),
                  ),
                ),
              ),
              Row(
                mainAxisAlignment: MainAxisAlignment.spaceAround,
                children: <Widget>[
                  FlatButton(
                    child: Text(
                      "Add To Cart",
                      style: TextStyle(color: Colors.grey[500]),
                    ),
                    onPressed: () => null,
                  ),
                  Text(
                    "\$5",
                    style: TextStyle(color: Colors.grey[500]),
                  )
                ],
              )
            ],
          ),
        ),
      ],
    );
  }

}

实际应用 请对此有所了解。谢了。

最佳答案

这应该适用于一个项目

  body: new StreamBuilder(
    stream: Firestore.instance.collection("collection").snapshots(),
    builder: (context, snapshot) {
      if (!snapshot.hasData) {
        return Text(
          'No Data...',
        );
      } else { 
          <DocumentSnapshot> items = snapshot.data.documents;

          return new Lost_Card(
          headImageAssetPath : items[0]["url"]
          );
      }

如果您想从许多文档中创建列表构建器,请像这样使用它

        return new ListView.builder(
            itemCount: snapshot.data.documents.length,
            itemBuilder: (context, index) {
              DocumentSnapshot ds = snapshot.data.documents[index];
              return new Lost_Card(
                headImageAssetPath : ds["url"];

);

关于firebase - 从 Firestore 到 Flutter 的 Stream Builder,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50542771/

有关firebase - 从 Firestore 到 Flutter 的 Stream Builder的更多相关文章

  1. Flutter 环境变量配置和flutter doctor中的错误解决 - 2

    一、环境变量右键点击我的电脑-属性:然后找到环境变量 1.Android的SDK不在C盘的话需要额外配这个到用户环境变量:ANDROID_HOMED:\AndroidSDK2.然后在系统变量:Path中添加一条这样的值        D:\Flutter\flutter\bin             这个值写flutter包解压的实际地址即可 3.在系统变量中添加两个镜像变量:        变量名:FLUTTER_STORAGE_BASE_URL      变量值:https://storage.flutter-io.cn        变量名:PUB_HOSTED_URL      变量

  2. ruby - Firebase token 错误, "The custom token corresponds to a different audience." - 2

    我正在尝试在服务器上使用Ruby为Firebase生成JWTtoken。在3.0之前我们使用tokengenerator但升级后它停止工作。我用下面的代码得到的token给出了一个错误:Thecustomtokencorrespondstoadifferentaudience.我到处都找不到它的意思。private_key=OpenSSL::PKey::RSA.new谢谢 最佳答案 我也遇到了这个错误,我得到它是因为我使用了一个与firebase项目无关的服务帐户。在firebase项目下使用新key创建新服务帐户后,它开始工作。要

  3. 如何以android中的数组的形式获取firebase中节点的数据 - 2

    以这种格式,我在Firebase中有一个数据库。我必须以阵列列表的形式显示所有部门,例如导演,体育。代码:mAuth=FirebaseAuth.getInstance();mdatabase=FirebaseDatabase.getInstance().getReference().child("Department");mdatabase.addValueEventListener(newValueEventListener(){@OverridepublicvoidonDataChange(DataSnapshotdataSnapshot){ListDepartment=(ArrayLis

  4. javascript - 在 Firebase 中处理关联帐户 - 2

    我正在遵循Firebase关于社交登录的说明。下面是我正在使用的示例,从登录身份验证的Angular来看,它一切正常。但是,我有独立工作的Google和Facebook登录。我现在希望能够做的是链接帐户。实际上,您可以在下面看到这可能发生的情况(请参阅评论):Ifyouareusingmultipleauthprovidersonyourappyoushouldhandlelinkingtheuser'saccountshere.我已经尝试了很多我认为应该放在这里的变体,但都无济于事。任何人都可以就他们认为应该放在这里的内容指导我吗?谢谢!functioninitFBApp(){//R

  5. javascript - 如何仅获取 Firebase 数据库上的更改值? - 2

    如何在Firebase数据库上只获取更改的值?因为每次我更改dir的值时,例如:/some_user~id~name/data~order_id~order_name但是当我得到变化的数据时,我得到了所有的树结构,而不仅仅是变化的数据order_name。所以我只是想让它返回这样的东西:/some_user/data~order_name因此我可以确定发生更改的确切key数据是什么。我怎样才能做到这一点?谢谢。 最佳答案 将监听器附加到order_name引用。varuser="Alan";varref=firebase.datab

  6. javascript - 尝试登录时出现 React-native、Firebase 网络错误 - 2

    我遵循了使用Firebase的React-native登录教程,我使用create-react-native-app为了方便开发(我的package.json),我使用的是NodeJSv6.10.1,我使用的是Note4Device(4.4.4),我启用了Email/Password在Firebase控制台中进行身份验证,出于某种原因我得到:{code:"auth/network-request-failed",message:"Anetworkerror(suchastimeout,interruptedconnectionorunreachablehost)hasoccurred.

  7. javascript - Firebase 云函数 http 请求到另一个 firebase 云函数 - 2

    我有一个具有主要功能的主要Firebase云功能。但是我需要创建另一个更具体的,它使用主要云功能上的功能。我可以使用免费帐户从一个firebase云函数请求一个httpPost或Get到另一个firebase云函数吗?我试图做到这一点,但我收到“ENOTFOUND”消息,我想知道我的代码是否有问题,或者这只是免费帐户的限制。索引.js'usestrict';constfunctions=require('firebase-functions');constexpress=require('express');constapp=express();app.post('/test',fun

  8. javascript - 在 Firebase 位置更改时全局设置警报的最佳方式 - 2

    我在我的应用程序中使用Firebase的其中一件事是存储用户提交的反馈-使用push()将child添加到某个位置。理想情况下,每当一个新的child被添加到该位置时,我都可以收到一封电子邮件,但这只能通过某些Firebase服务直接完成,或者可能通过某些可以点击URL的Firebase服务间接完成(包含一个通过电子邮件发送给我的小脚本),但我找不到任何关于这两种能力的提及。我能想到的一件事是像小型Node.js服务器一样不断运行并使用on('child_added',cb)收听该引用,并在发生变化时通过电子邮件通知我。我正在使用Firebase尝试在没有服务器的情况下构建此应用程序,

  9. javascript - 本地修改数据的 Firebase 同步 : handling errors & global status - 2

    我有两个关于Firebasewebplatform的相关问题的synchronisationoflocally-modifieddatatotheserver:EveryclientsharingaFirebasedatabasemaintainsitsowninternalversionofanyactivedata.Whendataisupdatedorsaved,itiswrittentothislocalversionofthedatabase.TheFirebaseclientthensynchronizesthatdatawiththeFirebaseserversandw

  10. javascript - Firebase 未定义? - 2

    我正在开发一个Angular项目并使用Firebase,它出现错误并显示ReferenceError:Firebaseisnotdefined,但我不明白为什么。这是我的index.htmlMyContactsAppmyContacts我的contact.js'usestrict';angular.module('myContacts.contacts',['ngRoute','firebase']).config(['$routeProvider',function($routeProvider){$routeProvider.when('/contacts',{templateUr

随机推荐