Flutter-FutureBuilder-未获取 AsyncSnapshot 数据

Hab*_*eeb 5 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();
            },
          ),
        ),
      ),
    );
  }
}
Run Code Online (Sandbox Code Playgroud)

cip*_*nat 4

使用以下代码更改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
    },
  );

Run Code Online (Sandbox Code Playgroud)