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,
),
],
)
)
);
}
}
我得到的错误
构建时抛出了以下断言:必须向 Text 小部件提供非空字符串。'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 将是帖子。
推荐阅读
- java - 获取 PKIX 路径构建失败:sun.security.provider.certpath.SunCertPathBuilderException
- numpy - numpy数组中是否存在元素?
- microsoft-dynamics - 单一报告 - NAV 2016 中的多个设计?
- angular - mxGraph 及其与 Angular 8 的类型集成
- amazon-web-services - 在 AWS ECS 上托管的应用程序的响应中隐藏服务器签名或令牌
- icons - AppleScript 图标分辨率
- python - Gensim Word2Vec 模型通过增加 epoch 的数量变得更糟
- python - 类数如何影响 YOLO 网络中的速度 FPS
- fortran - 我有一个应该给出分段错误的 Fortran 程序,但它没有
- nginx - 如何使用 Openshift 将 nginx 配置为 nodejs pod 的代理服务器?