在flutter应用程序中从Firebase检索数据时

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在flutter应用程序中从Firebase检索数据时相关的知识,希望对你有一定的参考价值。

这是代码

import 'package:flutter/material.dart';
import 'Authentication.dart';
import 'photoUpload.dart';
import 'Posts.dart';
import 'package:firebase_database/firebase_database.dart';
// import 'package:flutter_blogapp/Authentication.dart';
// import 'package:flutter_blogapp/photoUpload.dart';


class HomePage extends StatefulWidget
{
  HomePage 
(
  {
    this.auth,
    this.onSignedOut,
  }
);
final AuthImplementation auth;
final VoidCallback onSignedOut;

  @override
  State<StatefulWidget> createState() 
  {
    return _HomePageState();
  }
}

class _HomePageState extends State<HomePage>
{

  List<Posts> postsList = [];

  @override
  void initState() 
  {
    super.initState();

    DatabaseReference postsRef = FirebaseDatabase.instance.reference().child("Posts");

    postsRef.once().then((DataSnapshot snap)
    {
      var KEYS = snap.value.keys;
      var DATA = snap.value;

      postsList.clear();

      for(var individualKey in KEYS)
      {
        Posts posts = new Posts
        (
          DATA[individualKey]['image'],
          DATA[individualKey]['desctiption'],
          DATA[individualKey]['data'],
          DATA[individualKey]['time'], 
        );

        postsList.add(posts);
      }

      setState(() 
      {
        print('Length : $postsList.length');
      });
    });
  }

  void _logoutUser() async
  {
    try 
    {
      await widget.auth.signOut();
      widget.onSignedOut();
    } 
    catch (e) 
    {
      print(e.toString());
    }
  }

  @override
  Widget build(BuildContext context) 
  {
    return new Scaffold
    (
      appBar:  new AppBar
      (
        title: new Text('Home'),
      ),


      body : new Container
      (
        child: postsList.length == 0 ? new Text(" No Post available ") : new ListView.builder
        (
          itemCount: postsList.length,
          itemBuilder: (_, index)
          //itemBuilder: (BuildContext _, int index ) //<-----
          {
            return PostsUI(postsList[index].image, postsList[index].description, postsList[index].date, postsList[index].time);
          }
        ),
      ),

      bottomNavigationBar: new BottomAppBar
      (
        color: Colors.pink,

        child: new Container
        (
          margin: const EdgeInsets.only(left: 70.0, right: 70.0),
          child: new Row
          (
            mainAxisAlignment: MainAxisAlignment.spaceBetween,
            mainAxisSize: MainAxisSize.max,

            children: <Widget>
            [
              new IconButton
              (
                icon: new Icon(Icons.local_car_wash),
                iconSize: 50,
                color: Colors.white, 

                onPressed: _logoutUser,

              ),

              new IconButton
              (
                icon: new Icon(Icons.add_a_photo),
                iconSize: 50,
                color: Colors.white,

                onPressed: ()
                {
                  Navigator.push
                  (
                    context, 
                    MaterialPageRoute(builder: (context)
                    {
                      return new UploadPhotoPage();
                    })
                  );
                },

              ),
            ],

          ),
        ),
      ),


    );
  }

                                                  // Designing Posts UI <remove from Text field><??'defaut value'>

  Widget PostsUI(String image, String description, String date, String time)
  {
    return new Card
    (
      elevation: 10.0,
      margin: EdgeInsets.all(15.0),


      child: new Container
      (
        padding: new EdgeInsets.all(14.0),

        child: new Column
        (
          crossAxisAlignment: CrossAxisAlignment.start,

          children: <Widget>
          [
            new Row
            (
              mainAxisAlignment: MainAxisAlignment.spaceBetween,

              children: <Widget>
              [
                new Text
                (
                  date,
                  style: Theme.of(context).textTheme.subtitle,
                  textAlign: TextAlign.center,
                ),

                new Text
                (
                  time,
                  style: Theme.of(context).textTheme.subtitle,
                  textAlign: TextAlign.center,
                ),                  //<----
              ],
            ),

            SizedBox(height: 10.0,),

            new Image.network(image, fit:BoxFit.cover),

            SizedBox(height: 10.0,),

            new Text
                (
                  description,  //= null ?  "true" : "False", //??'defaut value'
                  style: Theme.of(context).textTheme.subhead,
                  textAlign: TextAlign.center,
                ),


          ],

        )



      ) 

    );

  }
}import 'package:flutter/material.dart';
import 'Authentication.dart';
import 'photoUpload.dart';
import 'Posts.dart';
import 'package:firebase_database/firebase_database.dart';
// import 'package:flutter_blogapp/Authentication.dart';
// import 'package:flutter_blogapp/photoUpload.dart';


class HomePage extends StatefulWidget
{
  HomePage 
(
  {
    this.auth,
    this.onSignedOut,
  }
);
final AuthImplementation auth;
final VoidCallback onSignedOut;

  @override
  State<StatefulWidget> createState() 
  {
    return _HomePageState();
  }
}

class _HomePageState extends State<HomePage>
{

  List<Posts> postsList = [];

  @override
  void initState() 
  {
    super.initState();

    DatabaseReference postsRef = FirebaseDatabase.instance.reference().child("Posts");

    postsRef.once().then((DataSnapshot snap)
    {
      var KEYS = snap.value.keys;
      var DATA = snap.value;

      postsList.clear();

      for(var individualKey in KEYS)
      {
        Posts posts = new Posts
        (
          DATA[individualKey]['image'],
          DATA[individualKey]['desctiption'],
          DATA[individualKey]['data'],
          DATA[individualKey]['time'], 
        );

        postsList.add(posts);
      }

      setState(() 
      {
        print('Length : $postsList.length');
      });
    });
  }

  void _logoutUser() async
  {
    try 
    {
      await widget.auth.signOut();
      widget.onSignedOut();
    } 
    catch (e) 
    {
      print(e.toString());
    }
  }

  @override
  Widget build(BuildContext context) 
  {
    return new Scaffold
    (
      appBar:  new AppBar
      (
        title: new Text('Home'),
      ),


      body : new Container
      (
        child: postsList.length == 0 ? new Text(" No Post available ") : new ListView.builder
        (
          itemCount: postsList.length,
          itemBuilder: (_, index)
          //itemBuilder: (BuildContext _, int index ) //<-----
          {
            return PostsUI(postsList[index].image, postsList[index].description, postsList[index].date, postsList[index].time);
          }
        ),
      ),

      bottomNavigationBar: new BottomAppBar
      (
        color: Colors.pink,

        child: new Container
        (
          margin: const EdgeInsets.only(left: 70.0, right: 70.0),
          child: new Row
          (
            mainAxisAlignment: MainAxisAlignment.spaceBetween,
            mainAxisSize: MainAxisSize.max,

            children: <Widget>
            [
              new IconButton
              (
                icon: new Icon(Icons.local_car_wash),
                iconSize: 50,
                color: Colors.white, 

                onPressed: _logoutUser,

              ),

              new IconButton
              (
                icon: new Icon(Icons.add_a_photo),
                iconSize: 50,
                color: Colors.white,

                onPressed: ()
                {
                  Navigator.push
                  (
                    context, 
                    MaterialPageRoute(builder: (context)
                    {
                      return new UploadPhotoPage();
                    })
                  );
                },

              ),
            ],

          ),
        ),
      ),


    );
  }

                                                  // Designing Posts UI <remove from Text field><??'defaut value'>

  Widget PostsUI(String image, String description, String date, String time)
  {
    return new Card
    (
      elevation: 10.0,
      margin: EdgeInsets.all(15.0),


      child: new Container
      (
        padding: new EdgeInsets.all(14.0),

        child: new Column
        (
          crossAxisAlignment: CrossAxisAlignment.start,

          children: <Widget>
          [
            new Row
            (
              mainAxisAlignment: MainAxisAlignment.spaceBetween,

              children: <Widget>
              [
                new Text
                (
                  date,
                  style: Theme.of(context).textTheme.subtitle,
                  textAlign: TextAlign.center,
                ),

                new Text
                (
                  time,
                  style: Theme.of(context).textTheme.subtitle,
                  textAlign: TextAlign.center,
                ),                  //<----
              ],
            ),

            SizedBox(height: 10.0,),

            new Image.network(image, fit:BoxFit.cover),

            SizedBox(height: 10.0,),

            new Text
                (
                  description,  //= null ?  "true" : "False", //??'defaut value'
                  style: Theme.of(context).textTheme.subhead,
                  textAlign: TextAlign.center,
                ),


          ],

        )



      ) 

    );

  }
}

我得到的错误

下面的断言被构建:一个非空字符串必须是提供给“文本”小部件。 'package:flutter / src / widgets / text.dart':断言失败:第285行pos 10:'data!= null'

要么断言表明框架本身有错误,要么我们应该在此错误消息中提供更多的信息,以帮助您确定并解决根本原因。在任一情况下,请通过在GitHub上提交错误来报告此断言:https://github.com/flutter/flutter/issues/new?template=BUG.md

引发异常时,这是堆栈

2个新文本包:flutter /.../ widgets / text.dart:285

3 _HomePageState.PostsUI软件包:flutter_blogapp / HomePage.dart:184

4 _HomePageState.build。包:flutter_blogapp / HomePage.dart:100

5 SliverChildBuilderDelegate.build包:flutter /…/ widgets / sliver.dart:446

6 SliverMultiBoxAdaptorElement._build。包:flutter /…/ widgets / sliver.dart:1260

我该怎么做才能检索应用程序中的数据?我已经尽力了。有人可以帮助我找到我哪里错了吗?我最近开始学习。

答案

[第一件事,将代码从initState中拉出,并放入另一个函数中。这将使您的initState保持干净。我看到的是您正在尝试更新Firestore中的数据。您可以做的是定义一个新函数,如下所示:

final databaseReference = Firestore.instance;

setPostsData() async {
  DocumentSnapshot snapshot = await databaseReference
      .collection("NAME_OF_COLLECTION")
      .document("NAME_OF_DOCUMENT")
      .get();
  // use this DocumentSnapshot snapshot to get the current data that is there in the document inside of your collection.
  var currentData = snapshot.data;
  print(currentData); // to check whats actually there and if its working...

  //lets assume newPostsList is the data that you want to put in this referenced document.
  //to update the data in firestore:
  await databaseReference
      .collection("NAME_OF_COLLECTION")
      .document("NAME_OF_DOCUMENT")
      .updateData({newPostsList});
}

然后您可以将setPostsData放在initState中。

为此,您可能希望重新设计数据库结构,例如:它应该像用户->帖子-> List_of_all_posts。如果这样做,则NAME_OF_COLLECTION将成为用户,而NAME_OF_DOCUMENT将成为帖子。

以上是关于在flutter应用程序中从Firebase检索数据时的主要内容,如果未能解决你的问题,请参考以下文章

如何在flutter中从firebase获取数据

在 Flutter 中从 Firebase 实时数据库读取和存储数据

Flutter Firebase异步查询未在流函数中检索数据

如何在flutter中从firebase数据填充listview

在 Flutter App 中从 Firebase 存储加载 PDF 文件

在 Flutter 的下拉列表中从 Firebase 获取经过身份验证的用户列表