firebase - Flter-FutureBuilder-未获取 AsyncSnapshot 数据

标签 firebase flutter

我正在尝试使用 Future 从 Firestore 数据库中获取单个字符串数据并在 FutureBuilder 中使用该数据后.但是得到null快照数据中的值。提供了下面的完整代码。告诉我哪里出错了。

我可以打印 fetchPost() 中的数据功能。从 firestore 获取数据后,它进入 FutureBuilder ,

但快照数据为空- AsyncSnapshot<String>(ConnectionState.done, null, null)

import 'dart:async';
import 'dart:convert';

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

Future <String>fetchPost() async  {
  final DocumentReference documentReference = Firestore.instance.document("myData/dummy");
   documentReference.get().then((datasnapshot){
    if(datasnapshot.exists){
        print("get data" +datasnapshot.data['url']); ///this printing data //in console
        return datasnapshot.data['url'];


    }
  }).catchError((e){
    print("Error");
    print(e);
  });

}


void main() => runApp(MyApp(post: fetchPost()));

class MyApp extends StatelessWidget {
  final Future<String> post;

  MyApp({Key key, this.post}) : super(key: key);

  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      title: 'Fetch Data Example',
      theme: ThemeData(
        primarySwatch: Colors.blue,
      ),
      home: Scaffold(
        appBar: AppBar(
          title: Text('Fetch Data Example'),
        ),
        body: Center(
          child: FutureBuilder<String>(
            future: post,
            builder: (BuildContext context, AsyncSnapshot<String> snapshot) {
              print ("snapshot has data");
              print (snapshot); // this printing 'AsyncSnapshot<String>(ConnectionState.done, null, null)'
              print (snapshot.data);// this printing null
              if (snapshot.hasData) {

                return Text(snapshot.data);
              } else if (snapshot.hasError) {
                return Text("${snapshot.error}");
              }

              // By default, show a loading spinner
              return CircularProgressIndicator();
            },
          ),
        ),
      ),
    );
  }
}

最佳答案

更改您的 FutureBuilder使用以下代码,它应该适合您

  FutureBuilder(
    future: Firestore.instance.collection("myData").document("dummy").get(), 
    builder: (BuildContext context, AsyncSnapshot<DocumentSnapshot> snapshot) {
      switch (snapshot.connectionState) {
        case ConnectionState.none:
          return Text('Press button to start.');
        case ConnectionState.active:
        case ConnectionState.waiting:
          return Text('Awaiting result...');
        case ConnectionState.done:
          if (snapshot.hasError)
            return Text('Error: ${snapshot.error}');
          return Text('Result: ${snapshot.data}');
          // You can reach your snapshot.data['url'] in here
      }
      return null; // unreachable
    },
  );

关于firebase - Flter-FutureBuilder-未获取 AsyncSnapshot 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55321523/

相关文章:

image - Flutter:如何使用集合内的 Firestore 字段在应用程序中上传图像

firebase - flutter :FlutterFcmService - 致命:找不到回调

firebase - 添加 Firebase 数据、点和正斜杠

ios - 使用 Xcode/Objective C 订阅 FCM 主题时出现问题

firebase - Flutter Firestore 查询 2 个集合

ios - 未找到模块 'path_provider'

flutter - 我们如何在 Flutter for web 中显示 toast 或 snackbar ?

Flutter 检查 Assets 图像是否存在

flutter - 使用 ShaderMask 将边框半径应用于小部件

swift - 在 Firebase 中更新子节点。为什么只更新一个引用文献而不更新两个引用文献?