【问题标题】:Why is my variable not receiving the right value from Firestore?为什么我的变量没有从 Firestore 接收到正确的值?
【发布时间】:2020-08-01 00:35:20
【问题描述】:

我正在使用 Flutter。我只需要从 Firestore 获取一个值并为所有用户更新它。所以我使用listen 来保持值更新。我在一个变量中接收到值,但我不能在 listen 方法之外使用它。

import 'package:cloud_firestore/cloud_firestore.dart';
import 'package:flutter/cupertino.dart';
import 'package:flutter/material.dart';
 
class PaginaGraficos extends StatefulWidget {
  @override
  _PaginaGraficosState createState() => _PaginaGraficosState();
}
 
class _PaginaGraficosState extends State<PaginaGraficos> {
  
  @override
  Widget build(BuildContext context) {
 
    String _totalGeradoApp = "0";
 
    _getTotalGeradoApp () {
      Firestore.instance.collection("dados_app").snapshots().listen(
              ( snapshot ){
            var totalGeradoApp;
            for( DocumentSnapshot item in snapshot.documents ){
              var dados = item.data;
              totalGeradoApp = dados["total_gerado_app"];
              print("totalGeradoApp: $totalGeradoApp");
            }
            _totalGeradoApp = totalGeradoApp;
          }
      );
    }
    
    _getTotalGeradoApp();
    print("_totalGeradoApp: $_totalGeradoApp");
 
    return Container(
      child: Text("$_totalGeradoApp"),
    );
  }
}

有些名字是葡萄牙语,因为我是巴西人,但代码仍然可以理解。 我是 Dart 的新手,所以如果我在做一些愚蠢的事情,请告诉我。

【问题讨论】:

    标签: flutter dart google-cloud-firestore


    【解决方案1】:

    传递给listen 方法的function 将在值更新时执行,但其余代码只运行一次。因此,如果您希望在更新值时更新容器中的 Text - 请使用 StreamBuilder

    @override
    Widget build(BuildContext context) {
      return Container(
        child: StreamBuilder(
          stream: Firestore.instance.collection("dados_app").snapshots(),
          builder: (context, snapshot) {
            
            if(!snapshot.hasData) {
              return Text('Loading...');
            }
    
            // update _totalGeradoApp
            var totalGeradoApp;
            var docs = (snapshot.data as QuerySnapshot).documents;
            for(var item in docs) {
              var dados = item.data;
              totalGeradoApp = dados["total_gerado_app"];
            }
            _totalGeradoApp = totalGeradoApp;
    
            // return Text Widget with updated text
            return Text("$_totalGeradoApp");
        ),
      );
    }
    

    因此,在您的代码中,listener 被添加到 stream 并立即执行下一个代码,其中 Container 是使用 _totalGeradoApp 创建的,最初是 "0"。每当更新值时,_totalGeradoApp 就会更新,但 Container 中的文本不会更新。通过使用StreamBuilderText 小部件也会在新值可用时更新。

    【讨论】:

      猜你喜欢
      • 2021-12-14
      • 1970-01-01
      • 1970-01-01
      • 2017-06-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-19
      • 2013-08-19
      相关资源
      最近更新 更多